Caros colegas,
Estou começanco a testar a JPA como alternativa ao Hibernate e nso testes que estou fazendo estou tendo problemas com a alteração e a exclusão de registros
o código para exclusão é
EntityTransaction tx = manager.getTransaction();
tx.begin();
try {
System.out.println("Atualizando rotina 990...");
Rotina rotina = new Rotina();
rotina.setCdRotina(990); //essa é a PK da tabela
manager.merge(rotina);
manager.remove(rotina);
} catch (RuntimeException e) {
e.printStackTrace();
tx.rollback();
}
tx.commit();
LOG DO ERRO
----------------
java.lang.IllegalArgumentException: Entity must be managed to call remove: null, try merging the detached and try the remove again.
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.performRemove(UnitOfWorkImpl.java:2747)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.remove(EntityManagerImpl.java:215)
at br.com.synnapse.jpa.main.Controller.atualizaRotina(Controller.java:91)
at br.com.synnapse.jpa.main.Controller.teste(Controller.java:34)
at br.com.synnapse.jpa.main.JPA.main(JPA.java:11)
Exception in thread "main" java.lang.IllegalStateException:
Exception Description: No transaction is currently active
at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java :82)
at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:45)
at br.com.synnapse.jpa.main.Controller.atualizaRotina(Controller.java:97)
at br.com.synnapse.jpa.main.Controller.teste(Controller.java:34)
at br.com.synnapse.jpa.main.JPA.main(JPA.java:11)
código da alteração
codigo de alteração -- chave primaria de rotina = cdRotina
EntityTransaction tx = manager.getTransaction();
tx.begin();
try {
System.out.println("Atualizando rotina 990...");
Rotina rotina = new Rotina();
rotina.setCdRotina(990l);
rotina.setNome("Nome alterado");
manager.persist(rotina);
} catch (RuntimeException e) { // <-- importante, agora é runtime
e.printStackTrace ();
tx.rollback();
}
tx.commit();
LOG DO ERRO
[TopLink Warning]: 2006.10.01 08:52:28.224--UnitOfWork(15142448)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060908)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: duplicate key violates unique constraint "rotina_pkey"Error Code: 0
Call:INSERT INTO ROTINA (cd_rotina, NOME, nome_classe) VALUES (?, ?, ?)
bind => [990, Nome alterado, null]
Query:InsertObjectQuery(Nome alterado)
Exception in thread "main" javax.persistence.RollbackException : Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060908)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: duplicate key violates unique constraint "rotina_pkey"Error Code: 0
Call:INSERT INTO ROTINA (cd_rotina, NOME, nome_classe) VALUES (?, ?, ?)
bind => [990, Nome alterado, null]
Query:InsertObjectQuery(Nome alterado)
at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit (EntityTransactionImpl.java:109)
at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:45)
at br.com.synnapse.jpa.main.Controller.atualizaRotina(Controller.java :97)
at br.com.synnapse.jpa.main.Controller.teste(Controller.java:34)
at br.com.synnapse.jpa.main.JPA.main(JPA.java:11)
Caused by: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060908)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: duplicate key violates unique constraint "rotina_pkey"Error Code: 0
Call:INSERT INTO ROTINA (cd_rotina, NOME, nome_classe) VALUES (?, ?, ?)
bind => [990, Nome alterado, null]
Query:InsertObjectQuery(Nome alterado)
at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:295)
at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect (DatabaseAccessor.java:639)
at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:688)
at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall (DatabaseAccessor.java:477)
at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:437)
at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall (AbstractSession.java:675)
at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:213)
at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall (DatasourceCallQueryMechanism.java:199)
at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:331)
at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject (StatementQueryMechanism.java:176)
at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:190)
at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWrite (DatabaseQueryMechanism.java:457)
at oracle.toplink.essentials.queryframework.InsertObjectQuery.executeCommit(InsertObjectQuery.java:74)
at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedWrite (DatabaseQueryMechanism.java:635)
at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:599)
at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWriteWithChangeSet (DatabaseQueryMechanism.java:495)
at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:130)
at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.executeWriteWithChangeSet (DatabaseQueryMechanism.java:283)
at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:67)
at oracle.toplink.essentials.queryframework.DatabaseQuery.execute (DatabaseQuery.java:609)
at oracle.toplink.essentials.queryframework.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:536)
at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery (ObjectLevelModifyQuery.java:123)
at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:95)
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery (UnitOfWorkImpl.java:2218)
at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:937)
at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java :894)
at oracle.toplink.essentials.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:254)
at oracle.toplink.essentials.internal.sessions.CommitManager.commitAllObjectsWithChangeSet (CommitManager.java:175)
at oracle.toplink.essentials.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:2638)
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabase (UnitOfWorkImpl.java:1030)
at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:357)
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet (UnitOfWorkImpl.java:1112)
at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:82)
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitAndResume (UnitOfWorkImpl.java:842)
at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:90)
... 4 more
Caused by: org.postgresql.util.PSQLException : ERROR: duplicate key violates unique constraint "rotina_pkey"
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1525)
at org.postgresql.core.v3.QueryExecutorImpl.processResults (QueryExecutorImpl.java:1309)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:354)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:308)
at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect (DatabaseAccessor.java:632)
... 37 more
alguma idéia do que estou fazendo de errado?
[]'s
Leonardo