Inserção duplicada ao usar EntityLifeCycleListener  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
joaosavio
Java Ninja
[Avatar]

Membro desde: 13/12/2007 10:09:22
Mensagens: 269
Offline

Olá pessoas!
Estou com um erro estranho de inserção duplicada em minha aplicacao. Vou resumir o problema e depois coloco os codigos.

Tenho as seguintes classes:

- TestEntity - entidade simples com um metodo @PrePersist que está permanecendo na transação apos ela ser comitada pelo container
- Auditoria - entidade de auditoria
- Dataset<T> - interface do DatasetBean<T>
- DatasetBean<T> - Stateless bean que implementa Dataset
- DatasetFactory - instancia um EJB de dataset (faz um lookup)
- PersistenceLifeCycleListener - um listener do ciclo de vida das entidades, definido no arquivo ORM.xml (segundo o site http://docs.jboss.org/hibernate/core/4.0/hem/en-US/html/listeners.html)

Coloquei o problema em um teste junit (estou usando Glassfish embedded):



O fluxo do teste é o seguinte:

1. Após ter um objeto Dataset realizo a inserção



2. Após a inserção, o listener PostPersist é chamado, e tento inserir uma entidade de auditoria. Aqui, se eu descomentar //dataset.getEntityManager().clear(), o teste passa. Caso contrário dá erro (log abaixo).





Log - reparem nas linhas 8 e 12, o hibernate insere a mesma entidade:


persistence.xml


orm.xml


TestEntity


Auditoria


Entidade



Uma gambiarra para resolver o problema é dar um clear no EntityManager. O que estou fazendo de errado?

This message was edited 5 times. Last update was at 05/01/2012 11:33:22


Mestrando em Ciência da Computação - UNICAMP
SCJP 6
http://joaosavio.wordpress.com
[WWW]
jakefrog
GUJ Expert
[Avatar]

Membro desde: 22/01/2007 22:00:53
Mensagens: 4191
Offline

Faça um teste troque para auto:
@GeneratedValue(strategy = GenerationType.AUTO)

Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]

SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)

Vamos em frente que atrás vem gente!
joaosavio
Java Ninja
[Avatar]

Membro desde: 13/12/2007 10:09:22
Mensagens: 269
Offline

Mesmo erro

Mestrando em Ciência da Computação - UNICAMP
SCJP 6
http://joaosavio.wordpress.com
[WWW]
joaosavio
Java Ninja
[Avatar]

Membro desde: 13/12/2007 10:09:22
Mensagens: 269
Offline

Atualizei a descricao com o meu persistence.xml e retornei o método @PrePersist (original do problema). Tanto de um jeito quanto de outro da o mesmo problema

This message was edited 2 times. Last update was at 04/01/2012 23:46:53


Mestrando em Ciência da Computação - UNICAMP
SCJP 6
http://joaosavio.wordpress.com
[WWW]
jakefrog
GUJ Expert
[Avatar]

Membro desde: 22/01/2007 22:00:53
Mensagens: 4191
Offline

Agora que você falou desse @PrePersist que eu fui reparar.

Sua entidade está com @GeneratedValue(strategy = GenerationType.IDENTITY) e vc seta o ID dele na unha assim mesmo?
Você sabe como funciona o @GeneratedValue?
Retire essa linha e faça o teste.

Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]

SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)

Vamos em frente que atrás vem gente!
joaosavio
Java Ninja
[Avatar]

Membro desde: 13/12/2007 10:09:22
Mensagens: 269
Offline

Nao nao, o @PrePersist é so na TestEntity, e ela nao esta com @GeneratedValue

absss

Mestrando em Ciência da Computação - UNICAMP
SCJP 6
http://joaosavio.wordpress.com
[WWW]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team