3

具体的なクラス階層ごとのテーブルを使用してマップする必要がある次の 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つのテーブルしかありません:

  • 家 (id_property(PK)、住所、noOfRooms、totalArea、価格)
  • 土地 (id_property(PK)、住所、面積、単価)

私が理解している限り、この場合、.save() を呼び出す前に ID を明示的に生成する必要があるため、私の質問は次のとおりです。参加すると継続的なドメインを形成します。

4

3 に答える 3

3

関連する複数のテーブルに冗長な情報があるため、DBのモデルが間違っています。

具体的なクラスごとのテーブルは継承モデルであり、実行時に問題が発生する可能性があります。土地の住所を更新するが、家の住所は更新しないという状況が発生する可能性があるためです (意味的に)。Iow: このモデルを削除して、サブクラスごとのテーブルを導入すると、id とアドレスを持つプロパティ ベース テーブルと、プロパティ ベースの pk への FK である PK を持つ 2 つの分離されたテーブルができます。1 つは家固有のフィールドを持つ家です。 、もう 1 つは土地固有のフィールドを持つ土地です。

これは、エンティティ タイプ間の継承をリレーショナル テーブルに変換する方法であるため、最小限の問題が発生します (NIAM/ORM に関する Nijssen/Halpin の本を参照してください)。

于 2009-01-04T11:03:21.850 に答える
1

私は結合されたサブクラスで以下を使用しました

<key column="id"/>

これにより、サブクラスはプロパティ テーブルの ID を使用するようになります。これはそれに依存しているためです。(スーパー) 列は、スーパーへの外部参照であるサブクラスの列を参照します。

于 2009-01-04T08:01:25.227 に答える
0

解決策は、次の ID を格納する別のテーブルを作成することです。この値は、ユーザーが新しいエンティティを挿入するたびに変更する必要があります。このように、ドメインは連続しています

于 2009-01-29T21:02:54.213 に答える