Les méthodes load()
de Session
vous donnent un moyen de récupérer une instance persistante si vous connaissez déjà son identifiant. load()
prend un objet de classe et chargera l'état dans une instance nouvellement instanciée de cette classe, dans un état persistant.
Cat fritz = (Cat) sess.load(Cat.class, generatedId);
// you need to wrap primitive identifiers long id = 1234; DomesticCat pk = (DomesticCat) sess.load( DomesticCat.class, new Long(id) );
Alternativement, vous pouvez charger un état dans une instance donnée :
Cat cat = new DomesticCat(); // load pk's state into cat sess.load( cat, new Long(pkId) ); Set kittens = cat.getKittens();
Notez que load()
lèvera une exception irrécupérable s'il n'y a pas de ligne correspondante dans la base de données. Si la classe est mappée
avec un proxy, load()
retourne juste un proxy non initialisé et n'accède en fait pas à la base de données jusqu'à ce que vous invoquiez une méthode
du proxy. Ce comportement est très utile si vous souhaitez créer une association vers un objet sans réellement le charger
à partir de la base de données. Cela permet aussi à de multiples instances d'être chargées comme un lot si batch-size
est défini pour le mapping de la classe.
Si vous n'êtes pas certain qu'une ligne correspondante existe, vous devriez utiliser la méthode get()
, laquelle accède à la base de données immédiatement et retourne null s'il n'y a pas de ligne correspondante.
Cat cat = (Cat) sess.get(Cat.class, id); if (cat==null) { cat = new Cat(); sess.save(cat, id); } return cat;
Vous pouvez même charger un objet en employant un SELECT ... FOR UPDATE
SQL, en utilisant un LockMode
. Voir la documentation de l'API pour plus d'informations.
Cat cat = (Cat) sess.get(Cat.class, id, LockMode.UPGRADE);
Notez que n'importe quelles instances associées ou collections contenues ne sont pas sélectionnées par FOR UPDATE
, à moins que vous ne décidiez de spécifier lock
ou all
en tant que style de cascade pour l'association.
Il est possible de re-charger un objet et toutes ses collections à n'importe quel moment, en utilisant la méthode refresh()
. C'est utile lorsque des "triggers" de base de données sont utilisés pour initiliser certains propriétés de l'objet.
sess.save(cat); sess.flush(); //force the SQL INSERT sess.refresh(cat); //re-read the state (after the trigger executes)
Une question importante apparaît généralement à ce point : combien (NdT : de données) Hibernate charge-t-il de la base de
données et combient de SELECT
s utilisera-t-il ? Cela dépent de la stratégie de récupération et cela est expliqué dans Section 19.1, « Stratégies de chargement ».