2010-12-07 56 views
16

J'ai une question simple. J'ai trouvé cette configuration Hibernate sur notre projet:Mapping XML Hibernate: False False ou Fetch Select?

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

N'a pas fetch = "select" signifie "Lazy charge toutes les collections et entités" basées sur Fetching Strategies. Mais en écrivant paresseux = "faux" signifie ne pas la charge paresseuse. Donc, la configuration ci-dessus dit: "Désactiver le chargement paresseux. Activer le chargement paresseux." En effet, cela signifie que la propriété est paresseuse chargée?

donc je pourrais raccourcir cette config 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 n'est pas chercher = "select" 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 enlever lazy = "false"?

Répondre

38

Je pense que le mode Fetch et le temps d'extraction 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 la façon dont cette entité ou cette collection est chargée, lorsqu'elle doit être chargée.

Donc, pour répondre à votre question, ayant fetch="select" signifie:

"Un second SELECT est utilisé pour récupérer l'entité associée ou la collection Sauf si vous désactivez explicitement le chargement paresseux en spécifiant lazy =." False », cette La seconde sélection ne sera exécutée 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 drapeau lazy="true|false". Avec lazy="true" et fetch="select" Hibernate chargera la collection paresseuse et la chargera avec un select. Si vous définissez lazy="false", le même select sera exécuté, la différence sera qu'il sera exécuté avec impatience. J'espère que cela a du sens.

Jetez un oeil ici aussi: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

0

Si vous le définissez sur paresseux, la carte externe ne sélectionnera pas l'employé si cela n'est pas nécessaire. Le fetch montre comment interroger l'employé si nécessaire.

+0

Ajouter les deux propriétés n'est pas redondant? Ils ne se nient pas, n'est-ce pas? – chris