TL; DR如何强制创建 Hibernate 模式以在每个具体类的 table-per-concrete-class 设置中为下面显示的结构创建外键约束AbstractProperty.ownerId
,Owner.ownerId
而不Owner
向AbstractProperty
?
我正在开发一个具有以下类结构的项目:
有Owner
一个到 的一对一映射AbstractProperty
,它由ConcreteProperty
类扩展(和其他类似AnotherProperty
的,但这与这个问题的其余部分并不真正相关)。
TheAbstractProperty
真的只有一个属性,the abstractPropertyId
。因此,我们希望使用table-per-concrete-class结构,以表Owner
、ConcreteProperty
和表作为其他AbstractProperty
扩展类 ( AnotherProperty
) 结束。
为此,我创建了以下映射Owner
:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="Owner">
<id name="ownerId">
<generator class="identity"/>
</id>
<property name="ownerProperty"/>
<one-to-one name="abstractProperty"/>
</class>
</hibernate-mapping>
对于AbstractProperty
:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="AbstractProperty" abstract="true">
<id name="ownerId">
<generator class="foreign">
<param name="property">ownerId</param>
</generator>
</id>
<union-subclass name="ConcreteProperty">
<property name="concreteProperty"/>
</union-subclass>
<union-subclass name="AnotherProperty">
<property name="anotherProperty"/>
</union-subclass>
</class>
</hibernate-mapping>
这行得通。
但是,这是我的问题,使用此映射并让 Hibernate 为我创建模式 ( <property name="hbm2ddl.auto">create</property>
),它不会创建从ConcreteProperty.ownerId
数据库字段到Owner.ownerId
字段的外键约束。当我使用此映射创建反向约束的一对一字段时AbstractProperty
(其中该字段是java类中的类型):Owner
AbstractProperty
owner
Owner
AbstractProperty
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="AbstractProperty" abstract="true">
<id name="ownerId">
<generator class="foreign">
<param name="property">ownerId</param>
</generator>
</id>
<one-to-one name="owner" constrained="true"/>
<union-subclass name="ConcreteProperty">
<property name="concreteProperty"/>
</union-subclass>
<union-subclass name="AnotherProperty">
<property name="anotherProperty"/>
</union-subclass>
</class>
</hibernate-mapping>
如果我AbstractProperty.ownerId
的. Owner.ownerId
_Owner
AbstractProperty