O save() é utilizado para objetos novos, que não possuem um identifier ainda. Enquanto o merge() é utilizado para um objeto já existente, com um identifier, porém não pertence a um context (não está gerenciado).
Não sei exatamente o Hibernate, mas segundo a especificação da JPA, você pode utilizar tanto o persist() (mesmo que o save() do hibernate) como o merge() em um objeto NOVO, enquanto se você usar o persist() em um objeto com um identifier, você irá receber uma exceção (EntityExistsException).
J
jason_bourne
Então no final das contas, o melhor é sempre usar o merge()???
K
kleins
Merge é pra recolocar um objeto que saiu do banco… (Ex: como um update )
Persist é pra vc guardar no bd um novo objeto…
J
Jair_Rillo_Junior
Não!! Embora em teoria o merge() faça o mesmo papel do persist() no caso de objetos novos (eu lí isso mas não testei na prática), lembre-se que o código limpo e claro fala-se por sí só. Uma pessoa diferente que for dar manutenção e ler merge() ao invés de persist(), pode ter um outro entendimento.
J
jason_bourne
Eu tenho um exemplo aqui que se usa merge() em um e save() em outro, só não entendi o motivo: