質問

次の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を使用するようになります。 (スーパー)列は、スーパーへの外部参照であるサブクラスの列を参照します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top