-1

1 つのスーパークラスと 2 つのサブクラスの 3 つのクラスがあります。各サブクラスには他のサブクラスのコレクションがあり、それらの間の 1 対多の関係をマップしたいと考えています。私のスーパークラスは person で、サブクラスはリファラーとブローカーと呼ばれます。私が表現したい関係は、1 つのリファラーが多くのブローカーを持つことができ、1 つのブローカーが多くのリファラーを持つことができるということです。

@Component
@Entity
@Table(name="Referrer")
@PrimaryKeyJoinColumn(name="rowID")
public class Referrer extends Person implements Serializable{

    private static final long serialVersionUID = 972571370198603227L;

    @Column(name="rowId")
    private String referrerID;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn
    private List<Broker> brokers = new ArrayList<Broker>();

ブローカーは次のようになります。

@Component
@Entity
@Table(name="Broker")
@PrimaryKeyJoinColumn(name="rowID")
public class Broker extends Person implements Serializable {

    private static final long serialVersionUID = 5648239413711716027L;

    @Column(name="AdminID", nullable=true)
    private String adminID;

    @Column
    private boolean isAdmin = false;

    @OneToMany(cascade=CascadeType.ALL, mappedBy="referrer")
    private List<Referrer> referrers = new ArrayList<Referrer>();

Broker の主キーは、Person スーパークラスに含まれる rowID というフィールドである必要があります。

私は本当に立ち往生しているので、どんな助けも大歓迎です。

4

2 に答える 2

1

ブローカーの主キーが個人の場合、私のアプローチはこれです

  1. それぞれ独自のテーブルを持つ Person と Broker の間の 1 対 1 の結合関係を定義します

  2. Brokerのforeign-idジェネレーターでPersonのPKを使用します(カスケードが正常に機能するように双方向にします)

  3. Referrer についても同じことを繰り返します (独自のテーブルがあります)。

  4. 2 つの列 (もちろん名前は異なります) を持つ別の中間テーブルを導入し、両方のテーブル (Broker と Referrer) の複合 PK を作成します。Broker (および Referrer) に多対多のリレーションシップを使用し、中間テーブルのそれぞれの PK 列で Join を使用します。

于 2013-05-29T11:34:18.797 に答える