我有一个表,其中一个字段可以根据描述符值(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)
判别器用于在单个表中存储类层次结构.你有什么是一个有多重含义的单一课程.
使用table-per-class-hierarchy映射策略,多态持久性需要该元素,并声明表的鉴别器列.discriminator列包含标记值,用于告知持久层为特定行实例化哪个子类.
我不认为您可以为这些不同的含义使用单个AdminNote类.在数据库级别使用鉴别器来帮助区分一个子类 - 它实际上不是java对象模型的一部分.
您需要定义多个AdminNote子类,每个子类用于每个鉴别器值.