[RESOLVIDO] Detached Class. Inserir um objeto e alterar outro objeto em uma transação

4 respostas
cidao

Boa noite a todos,
Estou realizado um cadastro de uma movimentação e ao realizar essa movimentação a quantidade do produto deve ser alterada. A questão é que a movimentação ainda não existe e o produto já existe. Ou seja, na minha transação ao realizar o método .persist ele deve inserir a movimentação e realizar um update no produto.

MAS, quando eu é executado apresenta esse erro: detached entity passed to persist: cgas.models.Produto

O código é o seguinte:

@Entity
public class Movimentacao implements Serializable {
 
	@Id
	private Date data;
	 
	private double valor;
	 
	private int quantidade;
	@Id
	@ManyToOne 
	private Funcionario funcionario;
	@ManyToOne
	private Evento evento;
	@ManyToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST}) 
	private Produto produto;
@ManagedBean(name="daoMovimentacao")
@SessionScoped
public class MovimentacaoDAO implements Serializable {

	@ManagedProperty(value="#{connectionFactory.entityManager}")
	private EntityManager entityManager;
	
	public MovimentacaoDAO() {
		System.out.println("CRIANDO MovimentacaoDAO - @SessionScoped");
	}
public void salvar(Movimentacao obj) {		
		entityManager.getTransaction().begin();
		if(obj.getProduto() != null)
		{			
			Produto produto = obj.getProduto();			
			int quantidade = produto.getQuantidade();
			if(obj.getEvento().getAcaoProduto().equals(Acao.SOMAR.toString()))
				quantidade += obj.getQuantidade();
			else if(obj.getEvento().getAcaoProduto().equals(Acao.SUBTRAIR.toString()))
				quantidade -= obj.getQuantidade();
			produto.setQuantidade(quantidade);
			obj.setProduto(produto);
		}
		entityManager.persist(obj);		
		entityManager.getTransaction().commit();
	}

Grande abraço.

4 Respostas

Flavio_machine

Ja tentou atualizar o produto primeiro de depois salvar a movimentação ?

M

ao inves de

tenta usar o

R

Bom só uma dica, vc pode consultar o produto (do banco) para mudar o estado dele.

cidao

Então, funcionou quando eu troquei para merge

entityManager.merge(obj);

Mas eu tive que mudar a classe de movimentação e tirar o funcionário de PK.

public class Movimentacao implements Serializable {  
  
    @Id  
    private Date data;  
       
    private double valor;  
       
    private int quantidade;  

    @ManyToOne   
    private Funcionario funcionario;  
    @ManyToOne  
    private Evento evento;  
    @ManyToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST})   
    private Produto produto;

Considero como resolvido.
Agradeço a todos.

Criado 22 de julho de 2011
Ultima resposta 22 de jul. de 2011
Respostas 4
Participantes 4