2009-08-28 5 views
2

Considérons ces deux classes mappées à la même table. L'un est readonly via mutable = "false".Deux classes mappées à la même table (une en lecture seule) doivent être dans le bon ordre?

<class name="Funder" table="funder"> 
    <id name="id"> 
     <generator class="identity" /> 
    </id> 
    <property name="funder_name" /> 
    <property name="contact_name" /> 
    <property name="addr_line_1" /> 
    <property name="addr_line_2" /> 
    <property name="addr_line_3" /> 
    <property name="city" /> 
    <many-to-one name="state" column="state_id" foreign-key="FK_funder_state_id" fetch="join" /> 
    <property name="zip_code" length="10" /> 
    <property name="phone_number" length="30" /> 

    <property name="create_dt" update="false" not-null="true" /> 
    <many-to-one name="create_by" column="create_by" not-null="true" update="false" foreign-key="FK_funder_create_by" fetch="join" /> 
    <property name="last_update_dt" insert="false" /> 
    <many-to-one name="last_update_by" insert="false" foreign-key="FK_funder_last_update_by" fetch="join" /> 

    </class> 

    <class name="FunderSimple" table="funder" schema-action="none" mutable="false"> 
    <id name="id"> 
     <generator class="identity" /> 
    </id> 
    <property name="funder_name" /> 
    <property name="contact_name" /> 
    <property name="phone_number" /> 
    </class> 

Si je déplace la cartographie FunderSimple avant la cartographie Funder mon schéma ne pas correctement générer. Si je le laisse comme ci-dessus, cela fonctionne.

Est-ce intentionnel? Il semble que schema-action = "none" colle au nom_table et que les mappages ultérieurs à la même table ne génèreront pas le schéma. Je le fais comme ça parce que j'ai une autre classe nommée Contract qui a une clé étrangère à la table des bailleurs de fonds. Cependant, je n'ai pas besoin de toutes les colonnes des bailleurs de fonds lors du référencement de l'objet contrat.

<many-to-one name="funder_simple" column="funder_id" foreign-key="FK_contract_funder_id" fetch="join" /> 

Le programme de financement n'hérite pas de FunderSimple.

Dois-je utiliser une technique différente pour extraire uniquement un sous-ensemble de colonnes d'une table de clé étrangère? Est-ce que plusieurs-à-un est le seul moyen de configurer une clé étrangère?

en utilisant la version 2.1.0.4000

Répondre

2

Pour de telles situations, j'utilise des projections à la place. Je n'ai jamais mappé deux types à la même table (sauf pour des raisons d'héritage).

Alors, ce que je fais dans une telle situation est:

créer la classe FunderSimple et l'importer de sorte qu'il est connu par NHibernate:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <import class="MyNamespace.FunderSimple" /> 
</hibernate-mapping> 

Une fois que vous avez fait cela, vous peut créer une requête sur votre type 'Bonds', avec l'API ICriteria, mais vous pouvez spécifier que vous souhaitez que NHibernate retourne des instances de FunderSimple. Ainsi, NHibernate est suffisamment intelligent pour générer une requête SQL simplifiée, qui récupère uniquement les colonnes nécessaires pour remplir les instances de la classe FunderSimple.

Cela se fait comme suit:

ICriteria crit = session.CreateCriteria (typeof(Funder)); 
// add some expressions ... 
crit.Add (...); 

// Now, set the projection, and specify that FunderSimple should be returned 
crit.SetProjection (Projections.ProjectionList() 
         .Add (Projections.Property ("Id"), "Id") 
         .Add (Projections.Property ("funder_name"), "funder_name") 
         .Add (Projections.Property ("phone_number"), "phone_number")); 

crit.SetResultTransformer (Transformers.AliasToBean (typeof(FunderSimple))); 

crit.List <FunderSimple>(); 
+0

intéressant ... Mais, comment cela fonctionne-t du point de vue de la cartographie du contrat. Est-ce que je changerais le many-to-one en un lourd objet Funder et le mapperais en quelque sorte pour charger seulement un FunderSimple? – dotjoe

+1

Le contrat doit avoir une relation avec 'Bonds', puisque 'Bailleur' ​​est votre entité. Je ne vois que FunderSimple comme une sorte d'aide/conteneur afin d'afficher une liste de «bailleurs de fonds», où vous n'avez pas besoin d'avoir l'entité Fullder blown. Pourquoi voudriez-vous récupérer les instances de 'FunderSimple' lorsque vous récupérez une instance de contrat? –

+0

Je n'ai pas besoin de joindre toutes les clés étrangères inutiles du Bailleur, telles que les clés create_by et last_update_by d'une table Staff ... ce qui entraîne à son tour plus de jointures pour quelques clés dans la table Staff. Les champs FunderSimple sont les seuls dont j'ai besoin en ce qui concerne le contrat. Je doute que cela nuirait à la performance de rejoindre toutes ces tables inutiles chaque fois que je vais chercher un contrat. Mais, j'espérais juste qu'il y avait un moyen de contourner cela et d'interroger seulement ce dont j'avais besoin. – dotjoe

Questions connexes