J'ai une question simple. J'ai trouvé cette config Hibernate sur notre projet:
<many-to-one name="employee"
class="com.myapp.Employee"
cascade="merge"
lazy="false"
fetch="select">
<column name="employee_id"
sql-type="bigint"
not-null="true"/>
</many-to-one>
Est-ce que fetch = "select" signifie "Lazy charger toutes les collections et entités" basé sur Fetching Strategies . Mais en écrivant lazy = "false" signifie ne pas charger paresseusement. Ainsi, la configuration ci-dessus dit: "Désactivez le chargement paresseux. Activez le chargement paresseux." En effet, cela signifie que la propriété est chargée paresseusement?
Je pourrais donc raccourcir cette configuration comme:
<many-to-one name="employee"
class="com.myapp.Employee"
cascade="merge"
fetch="select">
<column name="employee_id"
sql-type="bigint"
not-null="true"/>
</many-to-one>
Mais fetch = "select" n'est-il pas le mode par défaut? Donc en effet, je peux déclarer la même configuration que:
<many-to-one name="employee"
class="com.myapp.Employee"
cascade="merge">
<column name="employee_id"
sql-type="bigint"
not-null="true"/>
</many-to-one>
Ai-je raison? Faux? Des idées? Merci
Si je veux activer le chargement paresseux, je dois ajouter lazy = "true" et supprimer lazy = "false" ?
Je pense que le mode de récupération et le temps de récupération sont des concepts qui ne se chevauchent pas totalement.
Lazy="true|false"
contrôle si une association est chargée avec impatience ou à la demande.
fetch="select|subselect|join|batch"
contrôle comment cette entité ou collection est chargée, quand elle doit être chargée.
Donc, pour répondre à votre question, avoir fetch="select"
veux dire:
"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 différée en spécifiant lazy =" false ", ce deuxième choix ne sera exécuté que lorsque vous accéderez à l'association." ( http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching )
Cela ne signifie pas que le chargement paresseux est désactivé! C'est contrôlé par le lazy="true|false"
drapeau. Avec lazy="true"
et fetch="select"
Hibernate chargera la collection paresseusement et la chargera avec un select. Si vous définissez lazy="false"
, la même sélection sera exécutée, la différence sera qu'elle sera exécutée avec impatience. J'espère que cela a du sens.
Jetez également un œil ici: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies
Si vous le définissez sur paresseux, la carte externe ne sélectionnera pas l'employé s'il n'est pas nécessaire. L'extraction montre comment interrogerait-elle l'employé si nécessaire.