Erro - EntityManagerFactory e Cascata

0 respostas
java
Satangozo

Imagine que eu tenho 2 objetos do tipo EntityManagerFactory emf1 e emf2, e 3 tabelas pai, mae, e filho.

O filho tem relacionamento com as outras duas tabelas. O mapeamento da mae e do pai tem a anotação

@OneToMany(cascade = CascadeType.REMOVE, mappedBy = ...

então eu uso o emf1 para persistir o pai, e o emf2 para persistir a mae e o filho assim:

//codigo que cria o pai...
EntityManager em1 = emf1.createEntityManager();
em1.getTransaction().begin();
em1.merge(pai);
em1.getTransaction().commit();

//codigo que cria a mae...
EntityManager em2 = emf2.createEntityManager();
em2.getTransaction().begin();
em2.merge(mae);
em2.getTransaction().commit();


Filho filho = new Filho();
filho.setMae(mae);
filho.setPai(pai);

EntityManager em3 = emf2.createEntityManager();
em3.getTransaction().begin();
em3.merge(filho);
em3.getTransaction().commit();

entretanto ao usar um entitymanager criado pelo emf2 eu não consigo excluir em cascata fazendo:

EntityManager em4 = emf2.createEntityManager();
em4.getTransaction().begin();
em4.remove(em4.merge(mae));
em4.getTransaction().commit();

isso termina em um rollBackException causado pela violação da chave estrangeira, entretanto, se eu usar o emf1 que não teve nada a ver na hora da criação da mae a operação conclui normalmente

EntityManager em5 = emf1.createEntityManager();
em5.getTransaction().begin();
em5.remove(em5.merge(mae));
em5.getTransaction().commit();

Agora na pratica… eu gostaria de usar somente um EntityManagerFactory em todo o cliclo de vida da minha aplicação para incluir mae e filho e nesse mesmo ciclo poder excluir a mae e o filho em cascata, mas atualmente eu tenho que reiniciar minha aplicação para poder fazer isso, ou instanciar outro entitymanagerfactory toda vez que eu realizo um delete em cascata… como resolvo isso?

Criado 15 de julho de 2016
Respostas 0
Participantes 1