Diego Plentz

13 Feb, 2007

Hibernate: save() ou persist()?

Posted by: Diego Plentz In: hibernate| java

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: 51% [?]

6 Responses to "Hibernate: save() ou persist()?"

1 | Marcos Silva Pereira

February 13th, 2007 at 1:33 pm

Avatar

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…

2 | Diego Pires Plentz

February 13th, 2007 at 11:12 pm

Avatar

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

3 | Fabio Kung

February 14th, 2007 at 12:05 pm

Avatar

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.

4 | Diego Pires Plentz

February 14th, 2007 at 12:08 pm

Avatar

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.

5 | Alexandre

February 23rd, 2007 at 6:02 pm

Avatar

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.

6 | Diego Pires Plentz

February 23rd, 2007 at 6:06 pm

Avatar

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.

Comment Form


  • Rodrigo Amaral Rosa: Olá Diego, como disse antes funcionou tudo certo no tutorial. Mas eu quis seguir um pouco mais além, configurando virtualhost no apache para o meu d
  • éricoulisses: absurdo: não consegui passar de 50kbps com o pacote de 500kbps, se cheguei a 50 foi um milagre, só fiz download de uma música e pronto, kkkkkk,
  • Tony Amorim: Ótimo Tutorial, parabéns.... Estou com problemas com pool de conexão no tomcat, não está funcionando. Funciona com o tomcat sózinho. Tony

Flickr PhotoStream

  • IMG_3498
  • IMG_3458
  • IMG_3450
  • IMG_3473
  • IMG_3469
  • IMG_3464
  • IMG_3444
  • IMG_3402

About

This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from.