Vivendo um impasse JPA e Testes - Loja Virtual completa
Estou vivendo um impasse:
Ao testar as classes de teste separadamente:
A classe UserSessionTest executa os testes perfeitamente sempre (em todas as situações descritas abaixo)
A classe ProductSessionTest executa os testes perfeitamente
A classe: SellSessionTest não aprova os testes! e dá esse erro:
java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: br.com.ecommerce.entity.Category[id=null].
Então,vou até a classe Produto e no campo category abaixo:
@NotNull
@ManyToOne(cascade={CascadeType.MERGE})
@Valid
@JoinColumn(referencedColumnName="ID", columnDefinition="integer")
private Category category;
No campo acima mudo o CascadeType.MERGE para CascadeType.ALL
Após essa mudança minha classe SellSessionTest que não aprovava os testes passa a APROVAR TODOS!
porém, minha classe: ProductSessionTest que antes aprovava todos os testes acaba falhando e aprova apenas 6 testes de 16!
Olha o erro:
saveProduct
23/03/2011 21:12:51 org.eclipse.persistence.session.file:/C:/pEcommerce/Ecommerce/build/web/WEB-INF/classes/_EcommercePU
AVISO:
Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO CATEGORY (ID, NAME, ACTIVE) VALUES (?, ?, ?)
bind => [1, Categoria 1 alterada, true]
Query: InsertObjectQuery(br.com.ecommerce.entity.Category[id=1])
Se eu volto até a classe Produto e no campo category mudo o CascadeType.ALL para CascadeType.MERGE , após issso, todos os testes da classe ProductSessionTest são aprovados e volto a ter o problema:
A classe: SellSessionTest para de aprovar os testes! e dá esse erro:
java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST:
br.com.ecommerce.entity.Category[id=null].
Moral da história: Arrumo o CascadeType.ALGUMACOISA e quebra uma classe e outra que estava quebrada volta a aprovar os testes, volto o CascadeType.OUTRACOISA e a classe quebrada funciona e a que funcionava pára de funcionar!
Alguém sabe o que eu faço?
Ao testar as classes de teste separadamente:
A classe UserSessionTest executa os testes perfeitamente sempre (em todas as situações descritas abaixo)
A classe ProductSessionTest executa os testes perfeitamente
A classe: SellSessionTest não aprova os testes! e dá esse erro:
java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: br.com.ecommerce.entity.Category[id=null].
Então,vou até a classe Produto e no campo category abaixo:
@NotNull
@ManyToOne(cascade={CascadeType.MERGE})
@Valid
@JoinColumn(referencedColumnName="ID", columnDefinition="integer")
private Category category;
No campo acima mudo o CascadeType.MERGE para CascadeType.ALL
Após essa mudança minha classe SellSessionTest que não aprovava os testes passa a APROVAR TODOS!
porém, minha classe: ProductSessionTest que antes aprovava todos os testes acaba falhando e aprova apenas 6 testes de 16!
Olha o erro:
saveProduct
23/03/2011 21:12:51 org.eclipse.persistence.session.file:/C:/pEcommerce/Ecommerce/build/web/WEB-INF/classes/_EcommercePU
AVISO:
Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO CATEGORY (ID, NAME, ACTIVE) VALUES (?, ?, ?)
bind => [1, Categoria 1 alterada, true]
Query: InsertObjectQuery(br.com.ecommerce.entity.Category[id=1])
Se eu volto até a classe Produto e no campo category mudo o CascadeType.ALL para CascadeType.MERGE , após issso, todos os testes da classe ProductSessionTest são aprovados e volto a ter o problema:
A classe: SellSessionTest para de aprovar os testes! e dá esse erro:
java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST:
br.com.ecommerce.entity.Category[id=null].
Moral da história: Arrumo o CascadeType.ALGUMACOISA e quebra uma classe e outra que estava quebrada volta a aprovar os testes, volto o CascadeType.OUTRACOISA e a classe quebrada funciona e a que funcionava pára de funcionar!
Alguém sabe o que eu faço?
Leandro Perez
Curtidas 0
Respostas
Leandro Perez
23/03/2011
Vou fazer um apelo:
Se o Diego olhar meu código ele vai encontrar o defeito.
"Melhorei o código" e agora roda todos os teste de uma classe e mais alguns da outra. Se eu trocar o cascade de ALL pra Merge, uma classe que rodava a metade funciona por inteiro e a que funcionava passa a funcionar pela metade
Isso ocorre mesmo fazendo como o código que baixei na aula 96 , ou vai um ou vai outro!
Percebí que o SellSession não tá conseguindo salvar a venda (não tá cascateando), porém que eu ponho cascade a outra clase (Product session) gera erros ao tentar dar MERGE gerando uma violação de PK!
Se o Diego olhar meu código ele vai encontrar o defeito.
"Melhorei o código" e agora roda todos os teste de uma classe e mais alguns da outra. Se eu trocar o cascade de ALL pra Merge, uma classe que rodava a metade funciona por inteiro e a que funcionava passa a funcionar pela metade
Isso ocorre mesmo fazendo como o código que baixei na aula 96 , ou vai um ou vai outro!
Percebí que o SellSession não tá conseguindo salvar a venda (não tá cascateando), porém que eu ponho cascade a outra clase (Product session) gera erros ao tentar dar MERGE gerando uma violação de PK!
GOSTEI 0
Leandro Perez
23/03/2011
Copiei todas as classes de entidade e de testes do arquivo do projeto (download do projeto).
Refatorei todas elas e ainda gera o mesmo defeito!
Parece ser um bug do JPA?
Refatorei todas elas e ainda gera o mesmo defeito!
Parece ser um bug do JPA?
GOSTEI 0
Dyego Carmo
23/03/2011
E verdade...
Parece ser um BUG de sincronização de colecoes do EclipseLInk
Estarei abrindo um BUG para eles darem uma olhada e te retorno !
Parece ser um BUG de sincronização de colecoes do EclipseLInk
Estarei abrindo um BUG para eles darem uma olhada e te retorno !
GOSTEI 0
Ricardo Silva
23/03/2011
Estou passando pela mesma situação.
GOSTEI 0
Orlando Júnior
23/03/2011
Eu tambem estou passando por isto, mas o meu dá erro no remove produtcs
Local Exception Stack: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`lojavirtual`.`callonavaliable`, CONSTRAINT `FK_CALLONAVALIABLE_PRODUTO_id` FOREIGN KEY (`PRODUTO_id`) REFERENCES `produto` (`id`)) Error Code: 1451 Call: DELETE FROM PRODUTO WHERE (id = ?) bind => [1 parameter bound] Query: DeleteObjectQuery(br.com.lojavirtual.entidade.Produto[ id=3 ]) at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:840) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:906) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:592) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:535) at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1717) at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:253) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteObject(DatasourceCallQueryMechanism.java:184) at org.eclipse.persistence.internal.queries.StatementQueryMechanism.deleteObject(StatementQueryMechanism.java:101) at org.eclipse.persistence.queries.DeleteObjectQuery.executeDatabaseQuery(DeleteObjectQuery.java:214) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:844) at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:743) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) at org.eclipse.persistence.queries.DeleteObjectQuery.executeInUnitOfWorkObjectLevelModifyQuery(DeleteObjectQuery.java:115) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2871) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1516) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1498) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1449) at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:334) at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:283) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1418) at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:636) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1505) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3143) at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:346) at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157) at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68) at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435) at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:855) at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5136) at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901) at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045) at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) at $Proxy132.removeProduto(Unknown Source) at br.com.lojavirtual.session.__EJB31_Generated__ProdutoSession__Intf____Bean__.removeProduto(Unknown Source) at br.com.lojavirtual.session.ProdutoSessionTest.testRemoveProduto(ProdutoSessionTest.java:344) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`lojavirtual`.`callonavaliable`, CONSTRAINT `FK_CALLONAVALIABLE_PRODUTO_id` FOREIGN KEY (`PRODUTO_id`) REFERENCES `produto` (`id`)) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.Util.getInstance(Util.java:384) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2409) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:831) ... 64 more Out 18, 2012 3:20:57 PM org.eclipse.persistence.session.file:/C:/Users/JORGE~1.PAS/AppData/Local/Temp/gfembed610435486252538282tmp/applications/classes/_EcomLojaVirtualPU.transaction WARNING: Local Exception Stack: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`lojavirtual`.`callonavaliable`, CONSTRAINT `FK_CALLONAVALIABLE_PRODUTO_id` FOREIGN KEY (`PRODUTO_id`) REFERENCES `produto` (`id`)) Error Code: 1451 Call: DELETE FROM PRODUTO WHERE (id = ?) bind => [1 parameter bound] Query: DeleteObjectQuery(br.com.lojavirtual.entidade.Produto[ id=3 ])
GOSTEI 0
Renato Santos
23/03/2011
Estou com o mesmo erro que o colega ai em cima alguém poderia me ajudar?
GOSTEI 0