| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 10:43:15
|
ffranceschi
JavaChild
![[Avatar]](/images/avatar/c80bfa00454a7564c07c0559808294fa.jpg)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 12:02:19
|
Felagund
GUJ Master
![[Avatar]](/images/avatar/d8d855c465198499868fb2b566ebee8d.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 12:19:40
|
Vini Fernandes
Virtual Machine Man
![[Avatar]](/images/avatar/84cd1f88d088c3a15254f37a22f6e5d6.jpg)
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! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/03/2009 16:14:48
|
ffranceschi
JavaChild
![[Avatar]](/images/avatar/c80bfa00454a7564c07c0559808294fa.jpg)
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 |
|
|
 |
|
|
|
|