2

休止状態で関係を達成するための最良の方法を見つけようとしています。Customer オブジェクトがあります。各顧客には、技術担当者、請求担当者、および販売担当者がいます。各タイプの連絡先は、まったく同じデータ構造 (電話、電子メール、住所など) を持っています。

私が最初に考えたのは、Contact テーブルを作成し、Customer テーブルに sales_contact、billing_contact、technical_contact の 3 つの列を作成することでした。これにより、同じ 2 つのテーブル間に 3 つの異なる外部キーの 1 対 1 の関係が作成されます。ただし、少なくとも注釈を使用して、これを Hibernate でマッピングするのは非常に難しいことがわかりました。

もう 1 つの考えは、多対多の関係にし、マッピング テーブルにタイプ フラグを設定することでした。したがって、顧客は複数の連絡先 (この場合は 3 つまで) を持つことができ、連絡先は複数の顧客に属することができます。でも、それをマッピングする方法もわかりませんでした。マップ テーブルのタイプ フィールドでしょうか? この属性は Contact Java モデル オブジェクトに表示されますか? Customer モデルには、一連の Contact オブジェクトがありますか。それとも 3 つの個別の Contact オブジェクトですか?

だから私は本当にここで2つのことを探しています.1.これをデータベースに実装する最良の方法は何ですか?

4

2 に答える 2

1

次のように簡単にできます。

@Entity
public class Contact {
    @Id
    private String id;
    private String phome;
    private String email;
    private String address;

    // ... Getters and Setters
}

@Entity
public class Customer {

    @Id
    @GeneratedValue
    private String id;

    @ManyToOne
    @JoinColumn(name = "ID")
    private Contact billingContact;

    @ManyToOne
    @JoinColumn(name = "ID")
    private Contact salesContact;

    @ManyToOne
    @JoinColumn(name = "ID")
    private Contact technicalContact;

    public Customer() {
    }

    // ... Getters and Setters
}

ここで、 BillingContactとSalesContactをオブジェクト レベルで区別したい場合は、Contact抽象化し、各タイプの連絡先でそれを実装できます。選択した継承戦略を指定するには、親クラスに注釈を付ける@Inheritance必要があります (ここでは SINGLE_TABLE が適切に聞こえます。技術的な識別子列を使用します - http://docs.jboss.org/hibernate/annotations/3.5/reference/を参照してください)。 ja/html_single/#d0e1168 )。

于 2012-05-15T15:26:43.277 に答える