Les instances nouvellement instanciées d'une classe persistante sont considérées éphémères par Hibernate. Nous pouvons rendre une instance éphémère persistante en l'associant avec une session :
DomesticCat fritz = new DomesticCat(); fritz.setColor(Color.GINGER); fritz.setSex('M'); fritz.setName("Fritz"); Long generatedId = (Long) sess.save(fritz);
Si Cat
a un identifiant généré, l'identifiant est généré et assigné au cat
lorsque save()
est appelée. Si Cat
a un identifiant assigned
, ou une clef composée, l'identifiant devrait être assigné à l'instance de cat
avant d'appeler save()
. Vous pouvez aussi utiliser persist()
à la place desave()
, avec la sémantique définie plus tôt dans le brouillon d'EJB3.
persist()
makes a transient instance persistent. However, it doesn't guarantee that the identifier value will be assigned to the persistent
instance immediately, the assignment might happen at flush time. persist()
also guarantees that it will not execute an INSERT
statement if it is called outside of transaction boundaries. This is useful in long-running conversations with an extended
Session/persistence context.
save()
does guarantee to return an identifier. If an INSERT has to be executed to get the identifier ( e.g. "identity" generator,
not "sequence"), this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is problematic
in a long-running conversation with an extended Session/persistence context.
Alternativement, vous pouvez assigner l'identifiant en utilisant une version surchargée de save()
.
DomesticCat pk = new DomesticCat(); pk.setColor(Color.TABBY); pk.setSex('F'); pk.setName("PK"); pk.setKittens( new HashSet() ); pk.addKitten(fritz); sess.save( pk, new Long(1234) );
Si l'objet que vous rendez persistant a des objets associés (par exemple, la collection kittens
dans l'exemple précédent), ces objets peuvent être rendus persistants dans n'importe quel ordre que vous souhaitez à moins
que vous ayez une contrainte NOT NULL
sur la colonne de la clef étrangère. Il n'y a jamais de risque de violer une contrainte de clef étrangère. Cependant, vous
pourriez violer une contrainte NOT NULL
si vous appeliez save()
sur les objets dans le mauvais ordre.
Habituellement, vous ne vous préoccupez pas de ce détail, puisque vous utiliserez très probablement la fonctionnalité de persistance transitive d'Hibernate pour sauvegarder les objets associés automatiquement. Alors, même les violations de contrainte NOT NULL
n'ont plus lieu - Hibernate prendra soin de tout. La persistance transitive est traitée plus loin dans ce chapitre.