JPA - update e delete

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

Resolvido o problema pessoal…

poste a solucao! pegou o objeto do merge?

sim…

exclusão

Rotina rot = merge(rotina);
manager.remove(rot);

alteração

Rotina rot = merge(rotina);
manager.persist(rot);

Caro amigo

Voce teria alguma aplicacao exemplo utilizando ejb 3.0 JPA com toplink ou hibernate utilizando os annotations @Remote, @Local com JBoss?

Grato

Esses comportamentos bizonhos da JPA são de lascar, só porque o objeto ainda não é gerenciado (e ele não sabe dizer que o objeto existe de verdade ou não) ele tem que dar pau, pior que isso ainda a falta de saveOrUpdate… :frowning:

[quote=leojribeiro]

alteração

Rotina rot = merge(rotina);
manager.persist(rot);[/quote]

nesse caso, como o objeto esta managed, voce nem precisa chamar o persist em rot!

mauricio, que falta te faz o saveOrUpdate, me de um exemplo.