Unique violada - EntityManager perde a transação!

3 respostas
ffranceschi

Ae pessoal,

Tenho um problema ao inserir um Lista de objetos no banco de dados quando uma unique é violada.
Exemplo, no banco de dados tenho um registro com o nome do Cliente chamado José.
Ao inserir a lista com nomes (Jose, Maria, Joao) a unique será violada no primeiro nome (Jose, dando uma ConstraintViolationException) e ao tentar inserir o resto dos objetos dá uma exceção que o EntityManager precisa estar dentro de uma transação.
Um jeito pra resolver isso, seria abrir uma nova transação para inserir cada objeto da lista, mas é um processo crítico e isso perderia performance, alguem tem uma solução e uma explicação pq o EntityManager se perde?

Abraços

3 Respostas

Felagund

não é o EntityManager que se perde

Quando se esta em uma transação e 1 dos elementos dessa transação encontrou erro, tudo que foi feito deve ser desfeito, isso que um Banco de Dados faz, não é o EntityManager não.

A solução seria faz uma transação para cada um.

Sacrificar um pouco de performance as vezes vale a pena para ter um funcionamento melhor.

[]'s

Vini_Fernandes

Cara, imagino que uma solucao possa estar no tratamento da excecao ConstraintViolationException, imagino que voce possa fazer algo como :

try{
 //inserindo os elementos da lista na base de dados
}catch(ConstraintViolationException cv){
  //caso a execao ocorra voce ira inserir todos os outros com excecao do elemento existente
}

Espero que isso te ajude!

Ate

ffranceschi

Felagund:
não é o EntityManager que se perde

Quando se esta em uma transação e 1 dos elementos dessa transação encontrou erro, tudo que foi feito deve ser desfeito, isso que um Banco de Dados faz, não é o EntityManager não.


Até onde eu conheço o banco de dados não funciona assim. Imagine eu rodar esses scripts na mao, mesmo dando um erro na unique, o banco de dados não perde o que eu ja fiz… Como uso o JPA dentro do JBoss e uso JTA nas transações, o que acontece é que quando é injetado um EntityManager, é criada uma transação no JTA e associada a ele, assim como ocorre um erro no JTA (EntityExistsException no caso) a transacao é marcada para rollback e assim o EntityManager se perde (fica sem uma transação)

Essa solução eu faço e funciona bem, mas perco performance, (calculei 20%, calculo meia boca tb, mas é por ai), isso num processo de billing onde performance é fundamenta é grande…
Valeu a dica!

@Vini Essa solução de tratar a Exception nao rola, mas valeu :slight_smile:

O que precisava era tentar mesmo recuperar essa transação, alguem tem mais alguma ideia?

Abraços!

Criado 3 de março de 2009
Ultima resposta 3 de mar. de 2009
Respostas 3
Participantes 3