0

Person、Building、および Address クラスがあるとします。人は複数の住所を持つことができ、建物は 1 つの住所を持つことができます。DB では、3 つすべてに独自の個別のテーブルがあります。Address テーブルがリンクされる方法は、fk_id 列と type 列を使用することです。人物の住所は、person_id を fk_id として保存し、タイプを「person」に設定することで保存されますが、建物の場合は、Building_id を fk_id として保存し、タイプを「Building」に設定します。これらの関係をマッピングする方法はありますか、DB を変換してリンク テーブルを使用し、多対多を行うか、単に HQL を使用してそのデータを取得する必要がありますか?

4

3 に答える 3

0

これを次のようにマップできます。

@Entity
public class Address {
  @ManyToOne @JoinColumn(name="person_id")
  private Person person;

  @OneToOne @JoinColumn(name="building_id")
  private Building building;
}

@Entity
public class Person {
  @OneToMany(mappedBy="person", targetEntity=Address.class)
  private Set<Address> addresses;
}

@Entity
public class Building {
  @OneToOne(mappedBy="building")
  private Address address;
}

この例では、住所に個人または建物のいずれかを含めることができます(両方を含めることはできません)。また、住所は関係の所有者と見なされ、個人または建物はその関係の「逆」側です。

そうは言っても、オブジェクトグラフを作成するには、カスケード保存(注釈の「カスケード」属性)を使用して、メモリ内にすべてのオブジェクトを作成し、人または建物を保存するだけで、自動的に保存することができます。それと一緒にAddressオブジェクト。

于 2012-05-17T12:32:24.680 に答える
0

答えが見つかりました。必要なのは、コレクションに「where」条件を追加することだけです。

于 2012-05-18T17:30:44.050 に答える
0

このようにエンティティをマッピングできます。

<class name="Address">
    <id name="addressId" column="addressId">
       <generator class="native"/>
    </id>
</class>

<class name="Person">
    <id name="personId" column="personId">
       <generator class="native"/>
    </id>
   <set name="addresses" table="PersonAddress">
       <key column="personId"/>
       <many-to-many column="addressId"
         unique="true"
         class="Address"/>
   </set>
</class>

<class name="Building">
    <id name="id" column="buildingId">
       <generator class="native"/>
    </id>
   <many-to-one name="address" 
      column="addressId" 
      unique="true"
      not-null="true"/>
</class>

追加のテーブル PersonAddress が必要です。

于 2012-05-17T12:28:34.910 に答える