【问题标题】:NHibernate map one-to-one relationship with intermediate tableNHibernate 映射与中间表的一对一关系
【发布时间】:2013-01-17 01:16:44
【问题描述】:

给定表格:

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,也没有办法在多对一中指定表。那么,如何通过中间连接表映射单个实体呢?

【问题讨论】:

    标签: c# nhibernate oracle11g


    【解决方案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)。

    【讨论】:

    • 对不起,如果我不清楚。是的,TableC.aId 是对 TableA.aId 的引用。 ClassB 确实有自己的映射文件。我真的很接近这个......我想。只需要再做一些测试。
    • @jbl 不错的解决方案。真的,我没看到! + ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多