Hibernate chargement paresseux ne fonctionne pas
J'utilise la version 3.6.1.Final
J'ai la propriété suivante dans mon entity bean
@JoinColumn( name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID" )
@ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY )
private FolderTbl parent;
Dans mon unité de test, Assertnull échoue parce que getParent() n'est pas nulle
assertNull( folderTbl.getParent() );
Quoi d'autre dois-je faire pour arrêter hibernate chargement de la mère?
source d'informationauteur Farouk Alhassan
Vous devez vous connecter pour publier un commentaire.
Même si vous réglez le paresseux à true, la valeur de parent ne sera pas nulle. Le lazy load utilise un proxy de l'objet et de l'affecter à la propriété parent. Lorsque nous essayons d'utiliser les parent(appel
getParent()
) il va charger le parent réel de l'objet à l'aide de l'objet proxy.Si vous ne voulez pas charger l'objet ne configurez pas la JPA propriétés de l'élément et de le définir comme transitoire.
Parent est configuré correctement à charge paresseusement , le point est que vous êtes de le tester à tort.
Hibernate va charger l'objet lorsque vous appelez la méthode
getParent()
, lors de la demande réelle de l'objet vient de charge .Vous pouvez vérifier cette chose par la configuration de
show_sql
de vrai. il va invoquer une requête lorsque vous appelezgetParent()
Pour certains scénarios, vous pourriez avoir besoin de ne pas charger le paresseux collection à tous. Vous pouvez avoir de la méthode ci-dessous pour détacher la collection à partir de la session.
Puis appeler cette méthode pour détacher la classe à partir de là où vous en avez besoin pour être null. Veuillez utiliser ce raccourci avec parcimonie, je vous suggère de réfléchir à d'autres façons de le faire avant de recourir à cette solution.
En fait, en invoquant getParent() peut retourner un proxy exemple qui montre la présence d'un parent.
Si vous accédez à d'autres domaines que l'id de la mère devrait être chargé si nécessaire.
Noter que la société mère peut être chargé par la transaction et donc résider dans le premier niveau de cache. Si oui, Hibernate ne sera pas normalement faire une autre requête à la base de données.
Comme dit avant, si votre entité a un non-transitoire référence à un parent getParent() retournera toujours une valeur non nulle, même si le parent lui-même n'est pas encore chargé.
Hibernate traite le chargement différé comme un indice. Voici ce que la JPA 2.0 spécification dit sur la page 364 Tableau 9.