2009-08-28 1 views
2

Betrachten Sie diese zwei Klassen, die derselben Tabelle zugeordnet sind. Einer ist readonly via veränderbar = "falsch".Zwei Klassen, die derselben Tabelle zugeordnet sind (eine readonly), müssen in der richtigen Reihenfolge sein?

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

Wenn ich die FunderSimple Mapping vor dem Funder Mapping mein Schema bewegt sich nicht korrekt erzeugen. Wenn ich es so belasse, wie es oben ist, funktioniert es.

Ist das von Entwurf? Es scheint, als ob die Schema-Aktion = "none" beim Tabellenname bleibt und spätere Mappings in derselben Tabelle das Schema nicht erzeugen.

Ich mache es so, weil ich eine andere Klasse namens Contract habe, die einen Fremdschlüssel für die Geldgebertabelle hat. Ich brauche jedoch nicht alle Geldspenderspalten, wenn ich vom Vertragsobjekt referenziere.

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

Funder erbt nicht von FunderSimple.

Soll ich eine andere Technik verwendet nur eine Teilmenge von Spalten aus einer Fremdschlüsseltabelle zu holen? Ist die Eins-zu-eins-Methode die einzige Möglichkeit, einen Fremdschlüssel einzurichten?

Version mit 2.1.0.4000

Antwort

2

Für solche Situationen verwende ich stattdessen Projektionen. Ich habe nie zwei Typen zu derselben Tabelle zugeordnet (außer aus Vererbungsgründen).

Also, was ich in einer solchen Situation zu tun ist:

die FunderSimple Klasse erstellen, und es importieren, so dass es durch NHibernate bekannt ist:

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

Sobald Sie dies getan haben, können Sie Mit der ICriteria-API können Sie eine Abfrage für Ihren Typ "Funder" erstellen. Sie können jedoch angeben, dass NHibernate Instanzen von FunderSimple zurückgeben soll. Dadurch ist NHibernate intelligent genug, um eine vereinfachte SQL-Abfrage zu generieren, die nur die Spalten abruft, die zum Auffüllen von Instanzen der FunderSimple-Klasse erforderlich sind.

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

interessant ... Aber wie funktioniert das aus der Perspektive Contract-Mapping:

Dies wird so gemacht. Würde ich das Many-to-One-Objekt zurück in das schwere Funder-Objekt ändern und irgendwie zuordnen, dass nur ein FunderSimple geladen wird? – dotjoe

+1

Der Vertrag sollte eine Beziehung zu 'Funder' haben, da 'Funder' Ihre Entität ist. Ich sehe FunderSimple nur als irgendeine Art von Helfer/Container, um eine Liste von 'Funder' anzuzeigen, wo Sie nicht die vollständige Funder-Entität haben müssen. Warum möchten Sie "FunderSimple" -Instanzen abrufen, wenn Sie eine Vertragsinstanz abrufen? –

+0

Ziemlich viel, so muß ich das nicht komme alle von dem Funder des nicht benötigte Fremdschlüssel wie die create_by und last_update_by Schlüssel zu einer Personal-Tabelle ... was wiederum zu mehr für ein paar Tasten in der Personal Tisch verbindet. Die FunderSimple Felder sind die einzigen, die ich brauche, soweit der Vertrag betroffen ist. Ich bezweifle, dass es die Leistung beeinträchtigen würde, all diese unnötigen Tische jedes Mal zu betreten, wenn ich einen Vertrag erhalte. Aber ich hatte nur gehofft, dass es einen Weg gibt, um das zu umgehen und nur das abzufragen, was ich brauche. – dotjoe

Verwandte Themen