web-dev-qa-db-fra.com

Hibernate XML Mapping: Lazy False ou Fetch Select?

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" ?

21
chris

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

44
octav

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.

1
HamoriZ