Unique violada - EntityManager perde a transação!  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
ffranceschi
JavaChild
[Avatar]

Membro desde: 23/08/2006 11:07:21
Mensagens: 130
Offline

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

This message was edited 1 time. Last update was at 03/03/2009 10:50:12


Fernando Franceschi
Blog - http://ffranceschi.wordpress.com/
Twitter - http://twitter.com/ffranceschi1
[WWW]
Felagund
GUJ Master
[Avatar]

Membro desde: 26/07/2006 11:51:36
Mensagens: 1732
Localização: Santa e Bela Catarina
Offline

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

att
Rafael Felix

Rolling With Code
Twitter
[WWW]
Vini Fernandes
Virtual Machine Man
[Avatar]

Membro desde: 20/01/2009 08:43:02
Mensagens: 523
Offline

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



Espero que isso te ajude!

Ate

What do you know about Java? Help me!
[MSN]
ffranceschi
JavaChild
[Avatar]

Membro desde: 23/08/2006 11:07:21
Mensagens: 130
Offline

Felagund wrote: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)

Felagund wrote:
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.


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

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



Abraços!

This message was edited 2 times. Last update was at 03/03/2009 16:17:32


Fernando Franceschi
Blog - http://ffranceschi.wordpress.com/
Twitter - http://twitter.com/ffranceschi1
[WWW]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team