Fórum Vivendo um impasse JPA e Testes - Loja Virtual completa #397919

23/03/2011

0

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?
Leandro Perez

Leandro Perez

Responder

Posts

24/03/2011

Leandro Perez

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!
Responder

Gostei + 0

24/03/2011

Leandro Perez

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?
Responder

Gostei + 0

25/03/2011

Dyego Carmo

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 !
Responder

Gostei + 0

26/04/2011

Ricardo Silva

Estou passando pela mesma situação.
Responder

Gostei + 0

18/10/2012

Orlando Júnior

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 ])
Responder

Gostei + 0

24/01/2013

Renato Santos

Estou com o mesmo erro que o colega ai em cima alguém poderia me ajudar?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar