J'utilise Hibernate pour vous connecter à ma base de données. J'ai une structure d'héritage dans ma candidature. Le problème est que lorsque je fais une requête comme "de l'animal", il fait une jointure extérieure gauche pour l'animal de classe, ses sous-classes et toutes les associations d'animaux et de ses sous-classes. Comment puis-je éviter cette situation. Je veux charger les données uniquement lorsque je le spécifie via un fetchmode dans ma requête de critère? P>
4 Réponses :
Il s'agit fondamentalement, c'est le motif de conception de héritage par défaut d'orm utilisé par Hibernate appelé héritage de classe (toutes les classes sont mappées sur une seule table), si vous souhaitez modifier votre Google:
- Hierarhy ou table de classe unique par classe (cela fera mapper chaque classe à une table séparée dans la DB)
- Classe de béton Hierarhy (cela ne fera que les implémentations concrètes à une table). P>
Les requêtes polymorphes se produisent vient de se produire, la stratégie d'héritage variable offre simplement une bonne ou une bonne aide. Mon point est que la modification de la stratégie d'héritage ne désactivera pas les requêtes polymorphes.
suppose que vous avez une structure de classe comme suit: puis lorsque vous sélectionnez tous les Une histoire différente sont les associations. Vous pouvez vous avoir créé des mappages de sorte que les associations soient une charge paresseuse au lieu de la charge impatiente. P> P> animal code> s, vous vous attendez également à charger tout chien code> s et chat code> s. Après tout, ils sont animal code> s. P>
Merci John. Je comprends ton point de vue. Pouvez-vous me faire savoir quoi spécifier dans le fichier de mappage afin que l'association soit chargée, uniquement lorsqu'elle est requise via FetchMode. Le problème que je suis confronté est que, lorsque je charge la superclasse, il charge également les associations de la sous-classe. Je veux éviter de faire ça
Pour une chargement paresseuse d'un à un, voir: communauté.jboss.org/wiki/ ... ou nhforge.org/doc/nh/fr/index.html#Collections-lazy
Cela fonctionnerait pour les associations (a - une relation). Cela fonctionnerait-il pour des requêtes polymorphes (IS-A) aussi?
Oui, Hibernate prend en charge les requêtes polymorphes. De la documentation:
14.8. Queries polymorphes h3>
une requête comme: p>
@javax.persistence.Entity @org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT) @Inheritance(strategy = InheritanceType.JOINED) public class Foo { ... }
Pour éviter plusieurs jointures lors de la recherche de la hiérarchie de classe Vous pouvez appliquer une stratégie de mappage de hiérarchie unique_Table, puis définissez des tables secondaires sur les sous-classes avec une stratégie de récupération de sélection. Cependant, cela vous transforme du modèle "JOB HUMPORY" dans le modèle "N + 1 SELECT" ". L'exemple: et quelle SQL est effectué sur plus à ce sujet APPROCHE ET GÉNÉRALES HIBERNATE PERFORMANCES CONSEILS Vous pouvez lire dans My Article . P> p> à partir de super code> Query HQL: p>
J'ai le même problème, je viens de supposer que cela doit le faire, car les tables n'est pas très grosse, je ne m'en pensais pas, mais je voudrais certainement savoir si vous pouvez l'empêcher.