Diferença entre o save() e o merge() - hibernate

Pessoal,

Qual é a principal diferença entre o save() e o merge() no hibernate? Pelo que pude entender é isso (corrijam-me se estiver errado)

save - persiste o objeto na sessão com um id novo gerado

merge - persiste o objeto na sessão com o mesmo id gerado anteriormente para aquele objeto

Condordam?

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).

Então no final das contas, o melhor é sempre usar o merge()???

Merge é pra recolocar um objeto que saiu do banco… (Ex: como um update )

Persist é pra vc guardar no bd um novo objeto…

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.

Eu tenho um exemplo aqui que se usa merge() em um e save() em outro, só não entendi o motivo:

		Session session = HibernateUtil.currentSession();
		Dao<Fornecedor> dao = new Dao<Fornecedor>(session,Fornecedor.class);
		dao.merge(this.fornecedor);
		
		this.fornecedor = new Fornecedor();
		Session session = HibernateUtil.currentSession();
		Dao<Fornecedor> fornecedorDao = new Dao<Fornecedor>(session,Fornecedor.class);
		Dao<ContaPagar> contaPagarDao = new Dao<ContaPagar>(session,ContaPagar.class);
		
		Long id = Long.valueOf(fornecedorSelecionado.getValue().toString());
		Fornecedor f = fornecedorDao.load(id);
		
		contaPagar.setFornecedor(f);
		contaPagarDao.merge(contaPagar);
		contaPagar = new ContaPagar();

http://plentz.org/2007/02/13/hibernate-save-ou-persist/

Vlw!

E na JPA, pelo que procurei aqui não tem o save, só o persist…

Tem algum método que me retorne o id gerado em JPA ?

[]´s

Rodrigo