Hibernateの具象クラス階層ごとのテーブル
-
03-07-2019 - |
質問
次のHibernateマッピングがあり、具体的なクラス階層ごとのテーブルを使用してマッピングする必要があります:
<hibernate-mapping package='dao'>
<meta attribute='class-description'></meta>
<class name='PropertyDAO'>
<id name='id' column='id_property'>
<generator class='assigned'/>
</id>
<property name='address' column='address' type='string'/>
<union-subclass name='HouseDAO' table='house'>
<property name='noOfRooms' column='noOfRooms'/>
<property name='totalArea' column='totalArea'/>
<property name='price' column='price'/>
</union-subclass>
<union-subclass name='LandDAO' table='land'>
<property name='area' column='area'/>
<property name='unitPrice' column='unitPrice'/>
</union-subclass>
</class>
</hibernate-mapping>
データベースには2つのテーブルしかないことを意味します:
- house(id_property(PK)、address、noOfRooms、totalArea、price)
- land(id_property(PK)、address、area、unitPrice)
私が理解した限りでは、この場合、.save()を呼び出す前にIDを明示的に生成する必要があるため、私の質問は次のとおりです。具象クラスは、結合されると連続したドメインを形成します。
解決 3
解決策は、次のIDを格納する別のテーブルを作成することです。この値は、ユーザーが新しいエンティティを挿入するたびに変更する必要があります。このように、ドメインは連続しています
他のヒント
関連する複数のテーブルに冗長な情報があるため、DB内のモデルが間違っています。
具象クラスごとのテーブルは、実行時に問題が発生する継承モデルであり、土地の住所は更新するが、家の住所は同じ(意味的に)に更新する場合があるためです。 Iow:このモデルを削除してサブクラスごとのテーブルを導入すると、idとアドレスを持つプロパティベーステーブルと、プロパティベースのpkへのFKであるPKを持つ2つの分離されたテーブルがあります。 、もう1つは土地固有のフィールドを持つ土地です。
これは、エンティティタイプ間の継承をリレーショナルテーブルに変換する方法であるため、問題の数が最も少なくなります(NIAM / ORMに関するNijssen / Halpinの本を参照してください)
joined-subclassで次を使用しました
<key column="id"/>
これにより、サブクラスがプロパティテーブルのIDを使用するようになります。 (スーパー)列は、スーパーへの外部参照であるサブクラスの列を参照します。
所属していません StackOverflow