TL; DR. Как я могу обеспечить создание схемы Hibernate для создания ограничения внешнего ключа в настройке таблицы за конкретный класс от AbstractProperty.ownerId
до Owner.ownerId
для структуры, отображаемой ниже, не добавляя свойство Owner
к AbstractProperty
?
Я работаю над проектом, где у меня есть следующая структура классов:
Owner
имеет взаимно однозначное сопоставление с AbstractProperty
, которое расширяется классом ConcreteProperty
(и другими, такими как AnotherProperty
, но это не актуально для остальной части этого вопроса).
AbstractProperty
действительно имеет только одно свойство, 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
до Owner
, используя это сопоставление для AbstractProperty
(где поле Owner
имеет тип Owner
в классе AbstractProperty
java ):
<?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
?