Campo Identity atualizado na Entity mesmo quando transação dá rollback

3 respostas
L

Olá,

Tenho uma aplicação Java EE e ao persistir os dados de uma entidade em um método de um EJB, quando ocorre algum erro (por exemplo, campo not-null não informado), a transação dá rollback corretamente, porém, o ID dessa entidade é retornado preenchido ao método que o chamou. Nesse caso, na minha tela aparece a mensagem de erro que trato no meu managed-bean e o campo ID também vem preenchido. O objeto não está voltando ao estado anterior da chamada do persist, mas ainda sim, eu sei que transação não foi comitada pois se saio e tento acessar novamente, o incremento está sequencial.

Meu campo ID está mapeado assim:

@Id @Column(name = "ID", unique = true, nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

Uso jboss-6.1.0 e a transações é gerenciada por ele.

Eu acabei de fazer um teste no Junit, criando uma EntityManager e controlando as transações manualmente, e o mesmo não ocorre.

Alguém pode me dar uma ajuda?

Obrigada,

3 Respostas

L

Complementando a pergunta, hoje fiz o seguinte teste e ele falhou:

try {
            entityManager.getTransaction().begin();
            entityManager.persist(item);
//            throw new Exception("teste");
//            throw new EJBTransactionRolledbackException("teste");
//            throw new ConstraintViolationException("teste", null, null);
            throw new RuntimeException("teste");
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
        } finally {
            if (entityManager.getTransaction().isActive()) {
                entityManager.getTransaction().commit();
            }
        }
        entityManager.close();
        factory.close();
        Assert.assertNull(item.getId());

Não sei se é certo afirmar que, se uma transação deu rollback, o objeto deveria voltar ao estado original.

[]s

Helbert

liss,

Está estranho você deveria tomar uma SQLException no meio do método persist interrompendo o fluxo por este motivo não haveria retorno. Você está realmente tomando esta exceção?

J

Ola. só para documentar o que achei referente a este problema.

eu desenvolvo com .Net e SQL Server, estive passando exatamente por essa situação
Percebi que “uma coluna identity em uma tabela incrementa mesmo quando falha (rollback)”. Pensei estar fazendo algo errado, faltando algum comando.

buscando no google, caí aqui.

Achei algo que responde a duvida do amigo, (embora possivelmente ele ja deve ter contornado isso de outra forma… rss)

http://technet.microsoft.com/pt-br/library/ms190315.aspx
"Instruções e transações com falha podem alterar a identidade atual de uma tabela e criar lacunas nos valores da coluna de identidade. O valor de identidade nunca é revertido, mesmo que a transação que tentou inserir o valor na tabela não seja confirmada. Por exemplo, se uma instrução INSERT falhar por causa de uma violação IGNORE_DUP_KEY, o valor de identidade atual para a tabela ainda será incrementado. "

Abraços

Criado 22 de maio de 2013
Ultima resposta 29 de out. de 2013
Respostas 3
Participantes 3