1

これを最初の試みで明確に説明できることを願っています。したがって、Person と Address という 2 つのエンティティがあります。1 人が複数の住所を持つことができるため、私の Person エンティティは住所のリストで構成されます。住所はさまざまな人の間で共有できますが、私の Address エンティティは Person エンティティへの参照を必要としないことに注意してください。また、各 Address エンティティにはランク属性があります。

私のテーブル構造は次のとおりです。

PERSON (
  person_id,
  etc,
  primary key (person_id)
)

ADDRESS (
  address_id,
  etc,
  primary key (address_id)
)

PERSON_ADDRESS_MAP (
  person_id,
  address_id,
  rank,
  foreign key (person_id) references person (person_id),
  foreign key (address_id) references address (address_id),
  primary key (person_id, address_id, rank)
)

上記を考えると、個人のアドレスのリスト、またはアドレスのランク属性に注釈を付ける方法がわかりません。Person は次のように見えると思います。

@Entity
public class Person {
  @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
  @JoinTable(name="person_address_map", joinColumns=@JoinColumn(name="person_id"), inverseJoinColumns=@JoinColumn(name="address_id") )
  private List<Address> addresses;
  ...
}

Address エンティティでランクに注釈を付ける方法がわかりません。

前もって感謝します

4

1 に答える 1

1

まず、Person と Address の論理的な関連付けは多対多です。これは、1 人の人物が多数のアドレスを持ち、1 つのアドレスが多数の人物によって共有されるためです。

あなたが言うには、ランクは Address のプロパティです。ただし、特定のアドレスの場合、ランクは 1 (ボブの場合) または 2 (メアリーの場合) になります。これは、ランクが Address のプロパティではないことを単純に示しています (テーブル モデルがそれを明確に示しています)。

したがって、問題の解決策は簡単です。PERSON_ADDRESS_MAP テーブルをエンティティにマップする必要があります。

public class Person {
    @OneToMany(mappedBy = "person")
    private Set<RankedAddress> rankedAddresses;
}

public class RankedAddress {
    @ManyToOne
    private Person person;

    @ManyToOne
    private Address address;
}

public class Address {
    @OneToMany(mappedBy = "adress")
    private Set<RankedAddress> rankedAddresses;
}

また、すべてのエンティティと同様に、1 列の自動生成 ID (および対応する列) を RankedAddress エンティティに追加することをお勧めします。

ランクが結合テーブルの唯一の追加要素であり、個人のアドレス リストの各アドレスのインデックスを含めるために使用される場合 (つまり、0 から N - 1 まで、N はユーザーのアドレスの数)、結合テーブルをエンティティにマップすることを強制しない代替手段があります。

public class Person {
    @ManyToMany
    @OrderColumn(name = "rank")
    private List<Address> addresses;
}

列の値は完全に JPA によって処理され、リスト内の特定のインデックスにあるすべてのアドレスを格納するためにのみ使用されることに注意してください。クエリには使用できず、リスト内のインデックスを取得する以外に、人のアドレスのランクを知ることはできません.

于 2013-07-17T20:23:10.113 に答える