Desenvolvimento WEB com Hibernate + JPA - Erro ao inserir entidade

Pessoal, tô com o seguinte erro ao inserir minha entidade ItemVenda:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.edu.ifbaiano.entidade.ItemVenda.

Meu código de inserir:

ItemPedido itemPedido = new ItemPedido();
				ItemPedidoDAO itemPedidoDAO = new ItemPedidoDAO();
				List<ItemPedido> listaItem = itemPedidoDAO
						.consultar(itemPedido);
				ItemVendaDAO itemVendaDAO = new ItemVendaDAO();
				for (ItemPedido i : listaItem) {
					ItemVenda itemVenda =  new ItemVenda();
					if (i.getCodPedido() == Integer.parseInt(request
							.getParameter("codPedido"))) {
						out.print(Venda.getCodVenda());
						itemVenda.setCodProduto(i.getCodProduto());
						itemVenda.setQuantidade(i.getQuantidade());
						itemVenda.setValorUnitario(i.getValorUnitario());
						itemVenda.setIdItemVenda(Venda.getCodVenda());
						itemVendaDAO.inserir(itemVenda);
					}
				}

Minha classe ItemVenda:

@Entity
@Table(name = "ItemVenda")
public class ItemVenda extends Entidade {
	@Id
	@GeneratedValue (strategy = GenerationType.IDENTITY)
	private int idItemVenda;
	@Column(name = "venda_codVenda", nullable = false)
	private int codVenda;
	@Column(name = "produto_codProduto", nullable = false)
	private int codProduto;
	private int quantidade;
	@Column(name = "precoUnitario", nullable = false)
	private double valorUnitario;
	
	public int getIdItemVenda() {
		return idItemVenda;
	}
	public void setIdItemVenda(int idItemVenda) {
		this.idItemVenda = idItemVenda;
	}
	public int getCodVenda() {
		return codVenda;
	}
	public void setCodVenda(int codVenda) {
		this.codVenda = codVenda;
	}
	public int getCodProduto() {
		return codProduto;
	}
	public void setCodProduto(int codProduto) {
		this.codProduto = codProduto;
	}
	public int getQuantidade() {
		return quantidade;
	}
	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}
	public double getValorUnitario() {
		return valorUnitario;
	}
	public void setValorUnitario(double valorUnitario) {
		this.valorUnitario = valorUnitario;
	}
	
	

}

O que pode estar ocasionado esse erro? Desde já, agradeço.

Cara, provavelmente a sessão já está fechada ou vc está persistindo um objeto que já tem id… tô meio sem tempo mas… dá uma pesquisada na anotação @Transactional

olha também: http://www.guj.com.br/java/98884-o-que-significa-detached-entity-passed-to-persist

@Transactional vem do Spring… não estou utilizando; tem como resolver sem ele?

tranquilo… posta o cod do seu DAO ai… itemVendaDAO.inserir(itemVenda); pra avaliar

em todo caso vc pode testar usar saveOrUpdate ao invés de persist no DAO
e a propósito… vc chegou a confirmar no dao se vc está com a sessão aberta ao tentar persistir os objetos?

Segue aí:

  • Sou iniciante em desenvolvimento WEB, sugestões sempre são bem vindas :slight_smile:
public class ItemVendaDAO implements DAO{
	EntityManagerFactory factory = null;
	EntityManager manager = null;

	public ItemVendaDAO() {
		factory = Persistence.createEntityManagerFactory("tarefas");
		manager = factory.createEntityManager();
	}


	@Override
	public boolean inserir(Entidade entidade) {
		boolean retorno = false;
		try {
			if (entidade instanceof ItemVenda) {// se o objeto for ItemVenda, -//
												// indica se um objeto
				retorno = true;								// (jáinstanciado) pertence a
												// uma classe.
				ItemVenda item = (ItemVenda) entidade;// converte
				manager.getTransaction().begin();
				manager.persist(item);
				manager.getTransaction().commit();
			}
		} catch (Exception e) {
			manager.getTransaction().rollback();
			e.printStackTrace();
		}
		return retorno;
	}

	@Override
	public void atualizar(Entidade entidade) {
		ItemVenda novo = (ItemVenda) entidade;
		try {
			if (entidade instanceof ItemVenda) {
				manager.getTransaction().begin();
				manager.merge(novo);
				manager.getTransaction().commit();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		
	}

	@Override
	public List consultar(Entidade entidade) {
		List<ItemVenda> lista = new ArrayList<ItemVenda>();
		try {
			if (entidade instanceof ItemVenda) {
				Session session = (Session) manager.getDelegate();
				Criteria criteria = session.createCriteria(ItemVenda.class);
				lista = criteria.list();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lista;
	}

	@Override
	public void remove(Entidade entidade) {
		try {
			if (entidade instanceof ItemVenda) {
				ItemVenda item = (ItemVenda) entidade;
				manager.getTransaction().begin();
				manager.remove(item);
				manager.getTransaction().commit();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

cara, eu vou testar isto a noite e posto aqui… to enrolado agora… mas faz um teste aí… tira o manager.persist(item) por manager.saveOrUpdate(item)…

Camarada, ele está utilizando JPA e, bem, em JPA não existe o saveOrUpdate…
Claro que ele poderia tentar o método merge, mas provavelmente ele terá o mesmo erro.
Veja estes exemplo.