0

我正在尝试映射旧数据库。我需要实施我认为应该成为鉴别器的东西。我的问题是鉴别器似乎仅在当前行上有要区分的列或公式时才起作用。对于我的情况,没有实际的区别,数据要么连接到一个表(如果存在),如果不存在,则连接到另一个表。为了使事情变得更加复杂,该表使用复合键。这是一个示例(在我编造时可能过于简单化了):

鉴于我的代码

public class SomeTable {
  public virtual int DataID { get; set; }
  public virtual int EmployeeOrCustomer { get; set; }
  public virtual Person Person { get; set; }
  public virtual int SomeValue { get; set; }
}

public abstract class Person {
  public virtual int ID { get; set; }
  public virtual string Name { get; set; }
}

public class Employee : Person {
  public virtual int EmployeeNumber { get; set; }
}

public class Customer : Person {
  public virtual int CustomerNumber { get; set; }
}

还有我的数据

-SomeTable-
DataID(K)  EmployeeOrCustomer(K)  SomeValue
     1                      1           100
     1                     22           222

-Employee-
ID            Name      EmployeNumber
 1        Joe Blow              12345

-Customer-
ID             Name    CustomerNumber
22        ACME Inc.              4242

我的映射:

<class name="SomeTable" abstract="true">
  <composite-id>
    <key-property name="DataID" />
    <key-property name="EmployeeOrCustomer" />
  </composite-id>
  <property name="SomeValue" />
  <!--   ?????? -->
</class>
<class name="Employee">
  <id name="ID" />
  <Property name="EmployeeNumber">
</Class>
<class name="Customer">
  <id name="ID" />
  <Property name="CustomerNumber">
</Class>

我的期望

DataID: 1,  SomeValue: 100  Person: { Employee: EmployeeNumber: 12345 }
DataID: 1,  SomeValue: 222, Person: { Customer: CustomerNumber: 4242 }

我考虑过加入 2 个表并将合并的表用作连接,但 2 个表有很大不同。此外,我无法修改架构,因此不能选择添加鉴别器列。

有任何想法吗?

4

1 回答 1

1

我认为您正在寻找的是联合子类继承映射

<class name="Person" abstract="true">
  <id name="Id">
    <generator class="assigned"/>
  </id>

  <union-subclass table="Employee" name="Employee">
    <property name="Name"/>
    <property name="EmployeeNumber"/>
  </union-subclass>

  <union-subclass table="Customer" name="Customer">
    <property name="Name"/>
    <property name="CustomerNumber"/>
  </union-subclass>
</class>

<class name="SomeTable" abstract="true">
  <composite-id>
    <key-property name="DataID" />
    <key-many-to-one name="Person" column="EmployeeOrCustomer" />
  </composite-id>
  <property name="SomeValue" />
</class>

请注意,不需要额外的属性EmployeeOrCustomer

于 2013-02-13T19:12:34.887 回答