2010-02-12 74 views
3

我有这些遗留表,我通过nhibernate访问,基本的一个实体访问是好的,但我真的需要得到连接工作。nhibernate映射,加入没有主键和外键

理想情况下,我会有主键和外键来定义连接,但因为这些是遗留表,我只有合并id是表的索引,这些索引已用于性能的原因,所以我不能改变。

反正我有JobHeader表和属性表

JobHeader映射看起来像这样的时刻:


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="JobHeader " dynamic-update="true" table="JOB_HEADER"> 
    <composite-id> 
     <key-property name="Company" column="JBH_COMPANY" type="String(6)" /> 
     <key-property name="ContractRef" column="JBH_CONTRACT_REF" type="String(10)" /> 
     <key-property name="JobRef" column="JBH_JOB_REF" type="String(10)" /> 
     <key-property name="Status" column="JBH_STATUS" type="String(10)" /> 
    </composite-id> 
    <property name="RowId" column="TK_ROWID" type="Int32" not-null="true" /> 
    <property name="PropRef" column="JBH_PROP_REF" type="String(20)" not-null="false" /> 
    </class> 
</hibernate-mapping> 

而且房产测绘是这样的:


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Property" dynamic-update="true" table="PROPERTY"> 
    <composite-id> 
     <key-property name="Company" column="PRP_COMPANY" type="String(6)" /> 
     <key-property name="Reference" column="PRP_REFERENCE" type="String(20)" /> 
    </composite-id> 
    <property name="RowId" column="TK_ROWID" type="Int32" not-null="true" /> 
    <property name="Name" column="PRP_NAME" type="String(40)" not-null="false" /> 
    </class> 
</hibernate-mapping> 

在Jobheader它使用“PropRef”来保存“参考”属性。

我想创建一个将被称为JobHeaderJoinedProperty 所以或许会是这个样子了新的映射文件:


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="JobHeaderJoinProperty" dynamic-update="true" table="JOB_HEADER"> 
    <composite-id> 
     <key-property name="Company" column="JBH_COMPANY" type="String(6)" /> 
     <key-property name="ContractRef" column="JBH_CONTRACT_REF" type="String(10)" /> 
     <key-property name="JobRef" column="JBH_JOB_REF" type="String(10)" /> 
     <key-property name="Status" column="JBH_STATUS" type="String(10)" /> 
    </composite-id> 
    <property name="RowId" column="TK_ROWID" type="Int32" not-null="true" /> 
    <property name="PropRef" column="JBH_PROP_REF" type="String(20)" not-null="false" /> </class> 
    <bag name="Property" fetch="join" > 
     <key column="Reference" property-ref="PropRef" /> 
     <one-to-one class="Property"/> 
    </bag> 
    </class> 
</hibernate-mapping> 

然后希望那么我JobHeaderJoinedProperty实体将能够与访问属性实体它在这里:


public virtual Property Property 
     { 
      get 
      { 
      return this.property; 
      } 
      set 
      { 
      this.property = value; 
      } 
     } 

通过nhibernate连接两个遗留表不应该太棘手?

我真的只是想复制内部连接在SQL会是这样:


Select * from job_header inner join property on property.reference = job_header.propref 

回答

0

是不是一个一对一的映射你是后?

<one-to-one 
     name="PropertyName"        (1) 
     class="Property"         (2) 
     cascade="all|none|save-update|delete"    (3) 
     constrained="true|false"       (4) 
     fetch="join|select"        (5) 
     property-ref="PropertyNameFromAssociatedClass"  (6) 
     access="field|property|nosetter|ClassName"   (7) 
/> 

所以你的情况这将是

<one-to-one 
     name="Property"        
     class="ClassName"         
     property-ref="PropRef" 
/> 

来源http://www.nhforge.org/doc/nh/en/#mapping-declaration-onetoone