使用鉴别器进行Hibernate映射

Mik*_*one 8 hibernate

我有一个表,其中一个字段可以根据描述符值(Project,TimeKeep或CostCenter)指向其他3个表中的一个外键.通常这是通过子类实现的,我想知道我有什么下面将工作. 请注意,子类名是相同的父类和noteObject属性映射到java.lang.Object类型的实例变量,所以应该只要接受一个项目,TimeKeep或CostCenter对象作为我们投来正确的类型.休眠会允许吗?谢谢.

<hibernate-mapping package="com.tlr.finance.mappings">

 <class name="AdminNotes" table="admin_notes">
    <id name="adminNoteId" column="admin_note_id" type="integer">
      <generator class="identity" />
    </id>

<discriminator column="note_type" type="string" />

<!-- make this property an enumerated type.  It is the discriminator -->
<property name="adminNoteType" column="note_type" type="string" not-null="true" />
<property name="adminNote" column="note" type="string" not-null="true" />
<property name="adminNoteAdded" column="note_date" type="timestamp"
  not-null="true" /> 

<subclass name="AdminNotes" discriminator-value="project" >
  <many-to-one name="noteObject" column="object_id" class="PsData" /><!-- Project -->
</subclass>

<subclass name="AdminNotes" discriminator-value="user" >
  <!-- rename timekeep to user -->
  <many-to-one name="noteObject" column="object_id" class="Timekeep" /><!-- user -->
</subclass>

<subclass name="AdminNotes" discriminator-value="costCenter" >
  <!-- rename timekeep to user -->
  <many-to-one name="noteObject" column="object_id" class="CostCenter" /><!-- cost center -->
</subclass>

  </class>

</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

ska*_*man 9

判别器用于在单个表中存储类层次结构.你有什么是一个有多重含义的单一课程.

http://docs.jboss.org/hibernate/core/3.5/reference/en-US/html/mapping.html#mapping-declaration-discriminator

使用table-per-class-hierarchy映射策略,多态持久性需要该元素,并声明表的鉴别器列.discriminator列包含标记值,用于告知持久层为特定行实例化哪个子类.

我不认为您可以为这些不同的含义使用单个AdminNote类.在数据库级别使用鉴别器来帮助区分一个子类 - 它实际上不是java对象模型的一部分.

您需要定义多个AdminNote子类,每个子类用于每个鉴别器值.