TL; DR Hibernateスキーマの作成を強制して、コンクリートクラスごとのテーブル設定で外部キー制約を作成する方法を教えてください。以下に表示される構造のAbstractProperty
にOwner
プロパティを追加しないで、AbstractProperty.ownerId
〜Owner.ownerId
を入力しますか?1対1コンクリートクラス構造の外部キーの作成
私は、私は以下のクラス構造を持ってプロジェクトに取り組んでいます:
Owner
はConcreteProperty
クラスによって拡張されAbstractProperty
への1対1のマッピングを、(持っていますAnotherProperty
のようなものがありますが、これはこの質問の残りの部分ではあまり関係ありません)。
AbstractProperty
には実際には1つのプロパティ、abstractPropertyId
があります。そのため、テーブルOwner
,ConcreteProperty
およびその他のAbstractProperty
拡張クラス(AnotherProperty
)のテーブルで終わるtable-per-concrete-class構造を使用します。
このため、私は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>
)、それはOwner.ownerId
フィールドへConcreteProperty.ownerId
データベースフィールドからの外部キー制約を作成しません。
<?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>
どのように私ができる:私は逆(owner
フィールドはAbstractProperty
JavaクラスのタイプOwner
である)AbstractProperty
ため、このマッピングを使用してOwner
へAbstractProperty
から一対一のフィールドを制約作成するときにそれはありません外部キーの作成をAbstractProperty
のOwner
フィールドなしでAbstractProperty.ownerId
からOwner.ownerId
に強制しますか?
'* Property'テーブルから' Owner'テーブルまでのDB列/参照があると期待したいのですが?あなたのスキームによると、DB内の外部キーは 'Owner'テーブルから* Propertyへの唯一の参照であると言います... –
' Owner'から 'abstractPropertyId'への外部キーを設定できません。どのテーブル(つまり、どの抽象プロパティー)が参照しているかを知ることはできません。 – drvdijk
実際の答えではありませんが、Why-What-Howスペクトルの「Why」に関する質問:Entity-Attribute-Valueモデルを明示的に作成していますか? –