L'attribut lazy=true
permet d'activer le chargement différé des collections parent et enfant et du même attribut fetch="select"
. Existe-t-il une différence entre lazy="true"
et fetch="select"
en veille prolongée?.
Oui.
L'attribut lazy
indique à hibernate when pour obtenir les enfants.
L'attribut fetch
indique à hibernate how d'obtenir les enfants.
Quand tu dis
L'attribut lazy = true permet le chargement paresseux des collections parent et enfant Et de la même chose fetch = "select" attribut
c'est carrément incorrect. La stratégie d’extraction sélective n’EST PAS la même chose que d’arrêter le chargement paresseux. En fait, de la documentation
Sélectionner la récupération: un deuxième SELECT est utilisé pour récupérer l'entité ou la collection Associée. À moins que vous ne désactiviez explicitement la récupération paresseuse en indiquant En spécifiant lazy = "false", cette deuxième sélection ne sera exécutée que lorsque vous accédez à l'association.
Lorsque nous disons fetch="select"
, il lancera toujours des requêtes distinctes pour extraire les objets d'association, même s'il s'agit de lazy ="false"
.
Mais lorsque nous disons lazy ="true"
, cela signifie qu'il récupérera les objets d'association dans une requête distincte, mais pas au moment du chargement de l'objet, mais lors du premier accès à l'association. Nous pouvons le faire en disant list().size()
.
Lorsque nous disons fetch="join"
, une seule requête est toujours déclenchée pour extraire les objets d'association de la base de données.
Pour résoudre n + 1 problème de sélection pour n requêtes (relation parent-enfant) en veille prolongée, nous utilisons fetch = "join" au lieu de fetch = "select". Le paramètre paresseux décide de charger ou non les objets enfants lors du chargement de l'objet parent. Vous devez définir ce fichier de mappage d'hibernation respectif de la classe parent.Lazy = true (signifie ne pas charger l'enfant) Par défaut, le chargement paresseux des objets enfants est true .