Diferenças entre em.merge(Object o) e em.refresh(Object o)  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
Cocota
JavaChild
[Avatar]

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
[WWW] [MSN]
Cocota
JavaChild
[Avatar]

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
[WWW] [MSN]
tnaires
GUJ Master
[Avatar]

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

Cocota
JavaChild
[Avatar]

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
[WWW] [MSN]
Paulo Silveira
Administrador
[Avatar]

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


[Email] [WWW]
tnaires
GUJ Master
[Avatar]

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

 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team