一尘不染

带有区分符的休眠映射

hibernate

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

<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>

阅读 155

收藏
2020-06-20

共1个答案

一尘不染

鉴别符用于将类层次结构存储在单个表中。您所拥有的只有一个类具有多种含义。

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

使用按类分类表映射策略进行多态持久化时,该元素是必需的,并声明该表的鉴别符列。鉴别符列包含标记值,这些值告诉持久性层要为特定行实例化的子类。

我认为您无法针对每种不同的含义使用单个AdminNote类。鉴别符在数据库级别用于帮助将一个子类与另一个子类区分开-它实际上不是Java对象模型的一部分。

您需要定义AdminNote的多个子类,每个区分项值一个。

2020-06-20