Hibernate: save() ou persist()?

13 Feb
2007

Hibernating Koala Bear

Por mais vasta que a documentação do Hibernate seja, sempre ficam pontos da API que precisam de melhorias na documentação. Um exemplo claro disso é esclarecer qual a diferença entre dois métodos da Session, o save() e o persist(). Ambos tem a mesma função: tornar uma instância transient em persistent. Segundo a doc da API:

  • persist() – Make a transient instance persistent.
  • save() – Persist the given transient instance, first assigning a generated identifier.

O método persist(), não garante que será atribuito um id à instância imediatamente, sendo que a associação ocorrerá quando o flush ocorrer. Além disso, ele garante que só irá executar um insert se estiver dentro do contexto de uma transaction. Já o save(), atribui a chave imediatamente, não importando se isso exige um insert (no caso do identity generator) ou se existe um contexto de transação. Isso explica também porque o save() retorna o Id gerado e o persist() é void.

Mais informações podem ser encontradas no Jira e no fórum do Hibernate.

update: não é somente eu que acha que a documentação precisa de melhorias nesse caso: HHH-1682

update 2: acabei de comitar a alteração na documentação, para a próxima versão do Hibernate (3.2.5), a seção Making objects persistent irá trazer informações mais detalhadas sobre a diferença entre os dois métodos.

Popularity: 28% [?]

by-nc-nd

7 Responses to Hibernate: save() ou persist()?

Avatar

Marcos Silva Pereira

February 13th, 2007 at 1:33 pm

Diego, que tal renomear esse post para “Hibernate: diferença entre save e persist”? Só para facilitar a vida do google e dos muitos desenvolvedores com duvidas sobre esse ponto.

valeuz…

Avatar

Diego Pires Plentz

February 13th, 2007 at 11:12 pm

Olá Marcos,

A sugestão é legal, mas vendo o contexto e o título, acho que fica fácil pro google indexar da forma que está.

Avatar

Fabio Kung

February 14th, 2007 at 12:05 pm

Bom saber. Para mim até hoje não tinha diferença nenhuma. Eu achava que tinham colocado o persist() na Session só para alinhar com a JPA.

Avatar

Diego Pires Plentz

February 14th, 2007 at 12:08 pm

Fábio, na verdade foi pra alinhar com a JPA sim. Este comportamento da Session do Hibernate é justamente para dar suporte ao persist() da JPA, já que o comportamento do save() não seguia a especificação.

Avatar

Alexandre

February 23rd, 2007 at 6:02 pm

Muito bom o post…
Mas vou ser sincero, usava muito o hibernate na empresa que eu estava, mas como mudei de empresa, voltei usar o JDBC com SQL. Acho bem mais completo do que usar Hibernate, logo não acho mais um framework necessario.

Avatar

Diego Pires Plentz

February 23rd, 2007 at 6:06 pm

Olá Alexandre,

Hibernate se torna extramamente mais produtivo do que JDBC à partir do momento que você o conhece bem e não trabalha em um ambiente com um modelo de banco muito bizarro. Em certos casos ele pode mais atrapalhar do que ajudar sim, mas cabe avaliar cada caso.

Avatar

Moacir da roza

October 2nd, 2009 at 10:38 am

Boa….
Otima explicação, sempre fiquei na duvida na diferença entre esses dois metodos, mas nunca havia me ligado que um retornava o ID e outro não.

Agora no trabalho foi necessario obter o id logo depois de inserido o objeto, e dei uma googlada e achei o seu Blog.

Valeu!
ps.:Fui teu aluno na Wansoft!
abrass

Comment Form

top