Skip to content

Hibernate: save() ou persist()?

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

{ 6 } Comments

  1. Marcos Silva Pereira | 13/02/2007 at 1:33 pm | Permalink

    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 | 13/02/2007 at 11:12 pm | Permalink

    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 | 14/02/2007 at 12:05 pm | Permalink

    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 | 14/02/2007 at 12:08 pm | Permalink

    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 | 23/02/2007 at 6:02 pm | Permalink

    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 | 23/02/2007 at 6:06 pm | Permalink

    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.

Post a Comment

Your email is never published nor shared. Required fields are marked *