2009-08-26 6 views
1

Je fais de l'héritage par table et tout fonctionne très bien - mais je remarque que quand je veux que l'entité de base (données de la table de base) NHProf montre une gauche outter join sur l'entité enfant/(table liée)Comment éviter une jointure en utilisant NHibernate 2.1 par héritage de table

Comment puis-je définir le comportement par défaut pour interroger uniquement les données nécessaires? Par exemple: lorsque je veux une liste d'éléments parents (et uniquement ces données), la requête renvoie uniquement moi cet élément.

en ce moment ma correspondance est semblable à ce qui suit:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="FormBase, ClassLibrary1" table="tbl_FormBase"> 
    <id name="BaseID" column="ID" type="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <property name="ImportDate" column="ImportDate" type="datetime" not-null="false" /> 
    <joined-subclass table="tbl_Form" name="Form, ClassLibrary1"> 
     <key column="ID"/> 
     <property name="gendate" column="gendate" type="string" not-null="false" /> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

Et l'exemple où je veux toutes les données de retour vs seulement l'entité mère est indiqué ci-dessous:

Dim r As New FormRepository() 
    Dim forms As List(Of Form) = r.GetFormCollection().ToList() 



    Dim fbr As New FormBaseRepository() 
    Dim fb As List(Of FormBase) = fbr.GetFormBaseCollection().ToList() 

Répondre

2

Vous pouvez » t. C'est ce qu'on appelle un "polymorphisme implicite" et c'est plutôt une fonctionnalité intéressante (bien que non désirée dans votre cas :-)) fournie par Hibernate. Lorsque vous interrogez une liste d'objets de base, les instances réelles renvoyées sont des implémentations concrètes réelles. Par conséquent, la jointure gauche est nécessaire pour Hibernate pour savoir si une entité particulière est une FormBase ou un Formulaire.

Mise à jour (trop gros pour tenir dans un commentaire): La question générale est que si vous deviez duper Hibernate en charge que l'entité de base vous pouvez finir avec l'état de session incompatibles. Considérez ce qui suit:

  1. Form instance (qui est conservé à la fois form_base et form tables) était en quelque sorte chargé comme FormBase.
  2. Vous l'avez supprimé.
  3. Au cours du vidage Hibernate (qui pense que nous avons affaire à FormBase et est donc heureusement ignorant qu'il y a 2 tables impliquées) émet une instruction DELETE FROM form qui déclenche une exception car FK est violé.

polymorphisme implicite existe pour empêcher que cela se produise - Form est toujours un Form, jamais FormBase. Vous pouvez, bien sûr, utiliser un mappage "table par hiérarchie" où tout est dans la même table et donc aucune jointure n'est nécessaire mais vous obtiendrez (potentiellement) beaucoup de colonnes NULL et - ergo - impossibilité de spécifier non-null sur les propriétés des enfants.

Cela dit, si cela est vraiment un énorme problème de performance pour vous (qui normalement ne doit pas être - on peut supposer qu'il est un indexé rejoindre), vous pouvez essayer d'utiliser une requête native pour revenir juste FormBase cas.

+0

Ahh ... - Y a-t-il une autre approche de ce problème d'héritage qui va séparer ma table de base si je demande cette entité et non l'enfant? (maintenant chaque élément enfant a sa propre table) –

+0

J'ai mis à jour ma réponse ci-dessus - trop de choses pour entrer dans le commentaire – ChssPly76

+0

Eh bien, je ne pense pas que c'est un gros problème dans mon POC actuellement, mais cette classe de base est héritée par presque 12 autres classes dans mon application de production ... donc je suis un peu inquiet (peut-être que je ne devrais pas être comme vous l'avez mentionné - chacun serait une jointure indexée) –

Questions connexes