2

JPAを使用して次の関係を実装するにはどうすればよいですか?

table person (
  id int,
  name text
)

table person_home (
    person_id int,
    home_id int,
    type char(1)       -- 'p' = primary, 's' = secondary
)

table home (
    id int,
    address text
)

人は多くの家を持つことができ、家には多くの人が住むことができます (つまり、ManyToMany 関係)。さらに、家はある人にとっては主たる住居であると同時に、別の人にとっては第 2 の住居になることもあります。

データベース スキーマは明確ですが、この関係をモデル化する方法がわかりません。

マッピング テーブル person_home を person_primary_home と person_secondary_home に分割することを考えましたが、可能であればスキーマを保持したいと考えています。

4

2 に答える 2

1

この質問は、ここでよく尋ねられ、回答されています:
JPA で @EmbeddedId として @ManyToOne 属性を含む複合主キーを作成する方法は?

次の 4 つのクラスが必要です。

  1. Person.java
  2. ホーム.java
  3. PersonH​​ome.java
  4. PersonH​​omePk.java

PersonH​​ome.java との 1 対多の関係で作成する Person.java および Home.java ファイル。主キーを識別するための @Id フィールドがあります。それぞれに @OneToMany 関係が定義され、少なくとも、PersonH​​ome エンティティのそれぞれのフィールドにマップされた mappingBy 属性が定義されます。つまり、 Person.java では、次のようなものを持つことができます

@OneToMany(cascade = CascadeType.ALL, mappedBy = "Person")
private Collection<PersonHome> personHome;

PersonH​​ome.java には、その主キーである PersonH​​omePk インスタンス宣言を識別する @EmbeddedId フィールドがあります (つまり、@Id 列の代わりに、結合の主キーを表すクラスの宣言に注釈を付ける @EmbeddedId があります)。表 PersonH​​ome )。その他のフィールドは、通常の列として宣言されます。PersonH​​ome.java は、person と home に対してそれぞれ 1 つずつ、2 つの ManyToOne リレーションも宣言します。これらは @JoinColumn アノテーションを使用します (属性 insertable=false および updatetable=false があることを確認してください)。データ型は Person クラスと Home クラスになります。すなわち

@EmbeddedId
protected PersonHomePk personHomePk;
@Column (name = "type")
private String type; 
@JoinColumn(name = "person_id", referencedColumnName = "person_id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Person person;

「ホーム」宣言にも同じことが必要です。

「タイプ」に char のみを使用するのはなぜですか。varchar をお勧めします。これにより、あなたがいなくなったときに保守する人が、あなたがいなくてもコードとデータベースをよりよく理解できるようになります。「detached」は「d」の方が理解しやすいです。

于 2012-06-15T20:31:52.043 に答える
0

person_home テーブルのリレーションシップ以外にメタデータを使用する場合、すべてのデータにアクセスできるようにするには、2 つの 1 対多のリレーションシップを持つ 3 つのオブジェクトを使用する必要があると思います。

primary_home_id と secondary_home_id を使用して、person テーブルからホーム テーブルへの 2 つの多対 1 の関係を作成することで、この必要性をなくすことができます。 .

于 2012-06-15T19:31:22.367 に答える