8
votes

Hibernate charge des sous-classes avec des classes

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?


1 commentaires

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.


4 Réponses :


0
votes

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


1 commentaires

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.



3
votes

suppose que vous avez une structure de classe comme suit: xxx

puis lorsque vous sélectionnez tous les animal s, vous vous attendez également à charger tout chien s et chat s. Après tout, ils sont animal s.

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.


3 commentaires

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?



18
votes

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 {
    ...
}


0 commentaires

0
votes

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

et quelle SQL est effectué sur à partir de super Query HQL: xxx

plus à ce sujet APPROCHE ET GÉNÉRALES HIBERNATE PERFORMANCES CONSEILS Vous pouvez lire dans My Article .


0 commentaires