NHibernate映射与中间表的一对一关系

时间:2013-01-16 16:01:57

标签: c# nhibernate oracle11g

鉴于表格:

TableA
aId
...

TableB
bId
...

TableC
aId
cId // Maps to TableB.bId

换句话说,TableA和TableB仅通过TableC中的条目相关联。

我想要以下课程:

public class ClassA
{
    aId
    ...
}

public class ClassB
{
    bId
    ...
}

public class ClassD : ClassA
{
   ClassB
}

因此,ClassD具有ClassA的所有属性,并添加了单个ClassB实例。

我最初的想法是使用:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping auto-import="false" xmlns="urn:nhibernate-mapping-2.2">
  <class name="ClassD" lazy="false" table="TableA" polymorphism="explicit">
    <id name="aId" column="aId" type="Guid">
      <generator class="CustomGuidGenerator" />
    </id>
    ...
    <many-to-one name="ClassB" column="cId" class="ClassB" cascade="all" not-found="ignore" />
  </class>
</hibernate-mapping>

显然,在这个映射中,TableA中没有cId,也没有多对一的方法来指定表。那么,如何通过中间连接表映射单个实体?

1 个答案:

答案 0 :(得分:1)

不确定表中究竟是什么(TableC.aId是对TableA.aId的引用吗?),但也许你可以选择每子类表策略(参见例如http://docs.huihoo.com/hibernate/nhibernate-reference-1.2.0/inheritance.html

<class name="ClassA" table="TableA">
  <id name="aId" column="aId" type="Guid">
    <generator class="CustomGuidGenerator" />
   </id>        
    <joined-subclass name="ClassD" table="TableC">
        <key column="aId"/>
        <many-to-one name="ClassB" column="cId" class="ClassB" cascade="all" not-found="ignore" />
    </joined-subclass>
</class>

关于ClassB,它应该有自己的映射文件,系统将能够计算多对一ClassB属性的表名(TableB)。