| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 15:32:50
|
Cocota
JavaChild
![[Avatar]](/images/avatar/fdad3b5b2200b598dfde9517e5b426a8.jpg)
Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline
|
Olá,
Eu desconfio que essa seja uma pergunta de resposta muito simples, porém para mim, ela é necessária.
Estou fazendo as primeiras utilizações do JPA e não consegui entender a diferença entre esses dois métodos do EntityManager.
Qual deles faz realmente UPDATE no Banco de Dados?
Caso os dois façam UPDATE, por que existem os dois?
|
Ez RulEz Até de Madrugada |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 16:19:35
|
Cocota
JavaChild
![[Avatar]](/images/avatar/fdad3b5b2200b598dfde9517e5b426a8.jpg)
Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline
|
Agora a coisa complicou um pouco mais pra mim.
Criei três classes:
Usuario
Armamento
Cautela
Uma cautela é a união de um usuário com vários armamentos, além da data da cautela e um flag que condiciona se a cautela está aberta ou não.
Para tanto essa é a cara da Cautela
Tentei persistir de várias formas uma cautela, consegui de duas formas:
1. Criava uma cautela, atribuía-lhe os objetos Usuario e a lista de Armamento e persistia-os em cascata (com CascadeType.PERSIST) de uma só vez.
Porém dessa forma não é interessante, pois é contrária à regra de negócio do meu sistema, pois os Usuarios e os Armamentos são persistidos individualmente antes de qualquer cautela.
2. consegui com em.merge(Cautela c).
Eu sou muito preocupado com o porquê das coisas e já estava intrigado com a diferença entre merge() e refresh() e agora mais essa.
-- - - -
Isso é culpa desses tutoriais que cobrem os assuntos de forma muito superficial.
Ex:
Para persistir um objeto 'o' no banco de dados usando JPA, basta fazer
em.persist(o)
This message was edited 2 times. Last update was at 18/03/2010 16:24:19
|
Ez RulEz Até de Madrugada |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 16:34:28
|
tnaires
GUJ Master
![[Avatar]](/images/avatar/5f6371c9126149517d9ba475def53139.png)
Membro desde: 22/12/2003 08:05:58
Mensagens: 1634
Localização: Natal - RN
Offline
|
Olá
O método refresh() atualiza o estado da instância a partir do banco de dados. Trocando em miúdos, copia os dados do banco e joga nos atributos da instância.
O método merge() atualiza a instância no banco de dados, transferindo seu estado para o banco. Ou seja, quem realmente faz update é o método merge().
A única semelhança entre o comportamento dos dois métodos é que ambos tornam a instância managed, significando que seu estado está sincronizado com o contexto de persistência.
Isso é culpa desses tutoriais que cobrem os assuntos de forma muito superficial.
Talvez seja hora de rever suas fontes. Estude a documentação de referência do Hibernate.
This message was edited 1 time. Last update was at 18/03/2010 16:35:32
|
Tarso Nunes Aires
Blog - http://cabritin.wordpress.com/
Delicious - http://delicious.com/tnaires
Twitter - @tnaires
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 16:57:10
|
Cocota
JavaChild
![[Avatar]](/images/avatar/fdad3b5b2200b598dfde9517e5b426a8.jpg)
Membro desde: 03/04/2006 21:17:41
Mensagens: 149
Localização: Natal-RN
Offline
|
ok ok tnaires,
Sobre as minhas fontes, você há de convir que não existe um CREDIBILIDADÔMETRO pra me ajudar a escolher as mais confiáveis.
E também tenho uma pergunta.
Eu estou usando JPA e não Hibernate. A documentação do Hibernate me ajuda mesmo assim?
E sobre o persist e o merge?
Os dois salvam objetos no BD.
|
Ez RulEz Até de Madrugada |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 17:07:21
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4154
Localização: São Paulo
Offline
|
tnaires wrote:A única semelhança entre o comportamento dos dois métodos é que ambos tornam a instância managed, significando que seu estado está sincronizado com o contexto de persistência.
Isso mesmo!
So lembrando um detalhe técnico: o merge devolve um objeto managed a partir de um objeto (que pode estar managed ou nao), que é diferente de tornar a instancia em managed. Por isso que o merge devolve T (esse sim é managed). O refresh nao aceita objetos detached, só managed. Algumas implementações fazem algo um pouquinho diferente (hibernate deixa dar refresh em detached, mas a especificação não).
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2010 18:49:26
|
tnaires
GUJ Master
![[Avatar]](/images/avatar/5f6371c9126149517d9ba475def53139.png)
Membro desde: 22/12/2003 08:05:58
Mensagens: 1634
Localização: Natal - RN
Offline
|
Cocota wrote:Eu estou usando JPA e não Hibernate. A documentação do Hibernate me ajuda mesmo assim?
Ajuda sim, para Hibernate veja a referência do Hibernate Core. Para JPA veja a referência dos módulos Annotations e EntityManager.
Cocota wrote:E sobre o persist e o merge?
Os dois salvam objetos no BD.
O persist() recebe uma instância no estado transient e a torna persistente - consequentemente managed. Ou seja, para inserir dados use persist().
Paulo Silveira wrote:O refresh nao aceita objetos detached, só managed.
Exato. Se você tem uma instância detached e quer torná-la managed, merge() é o método correto a se usar.
|
Tarso Nunes Aires
Blog - http://cabritin.wordpress.com/
Delicious - http://delicious.com/tnaires
Twitter - @tnaires
 |
|
|
 |
|
|