Entidade com ID já preenchido: O hibernate faz INSERT ou UPDATE?

Tenho uma curiosidade…

Tenho uma classe mapeada para ter seu ID preenchido através de uma sequence de banco.
Se eu criar uma nova instância dessa classe, preencher o ID manualmente e tentar gravar, o hibernate tenta fazer INSERT ou UPDATE?

Obrigado!

Pergunta massa.

Bem, depende de como foi preenchido este id no seu objeto. São duas possibilidades básicas:

1 - Caso você recupere o id através de um método finde/getReference. Ele vai fazer somente um UPDATE;

2 - Caso você crie um novo objeto e mande-o persistir através do merge (se você utilizar persist() não vai funcionar ) ele vai checar no banco se a sua entidade existe, se sim vai fazer um UPDATE se não vai fazer um INSERT.

Para você entender básicamente o por que deste comportamente você deve procurar na internet mais sobre os estados das entidades utilizadas pelo hibernate (transiente, managed, detached e removed). Sugiro começar por esse link:

1 - http://blog.caelum.com.br/entidades-managed-transient-e-detached-no-hibernate-e-jpa/ (vai te dar uma boa ajuda)
2 - http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/objectstate.html (parte mais prática da documentação que passou desapercebido para mim)

Abraços,