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