我有一个带有一个字段的表,该字段可以根据说明符的值(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>
鉴别符用于将类层次结构存储在单个表中。您所拥有的只有一个类具有多种含义。
http://docs.jboss.org/hibernate/core/3.5/reference/zh- CN/html/mapping.html#mapping-declaration- discriminator
使用按类分类表映射策略进行多态持久化时,该元素是必需的,并声明该表的鉴别符列。鉴别符列包含标记值,这些值告诉持久性层要为特定行实例化的子类。
我认为您无法针对每种不同的含义使用单个AdminNote类。鉴别符在数据库级别用于帮助将一个子类与另一个子类区分开-它实际上不是Java对象模型的一部分。
您需要定义AdminNote的多个子类,每个区分项值一个。