7

リンク テーブルを使用して、Hibernate で多対多をマップしたいと思います。たとえば、Parent クラスと Child クラスの 2 つのクラスがあります。

public class Parent{

private List<Child> _children;

//...getters and setters
}

link_idparent_id、および の3 つの列を持つリンク テーブル (link_table) を使用しますchild_id。データベースは SQL サーバーであり、id タイプは uniqueidentifier です。そのため、通常は id フィールドに guid を使用します。

<list />これが使用する正しいタグである場合、タグを使用してこれをどのように実装できますか? これを達成するための適切なドキュメントを知っていますか?

私は現在 ConstraintViolationException を取得していますが、適切なドキュメントや例を見つけることができませんでした。

link_id主な問題は、リンクテーブルで自動的に生成されるように指定する方法だと思います。

4

4 に答える 4

8

これは、アノテーション、具体的には@ManyToManyと@JoinTableを使用して行います。

Hibernateドキュメント:

@Entity
public class Employer implements Serializable {
    @ManyToMany(
        targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
        cascade={CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(
        name="EMPLOYER_EMPLOYEE",
        joinColumns=@JoinColumn(name="EMPER_ID"),
        inverseJoinColumns=@JoinColumn(name="EMPEE_ID")
    )
    public Collection getEmployees() {
        return employees;
    }
}


@Entity
public class Employee implements Serializable {
    @ManyToMany(
        cascade = {CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy = "employees",
        targetEntity = Employer.class
    )
    public Collection getEmployers() {
        return employers;
    }
}
于 2008-12-23T01:30:42.133 に答える
5

結合テーブルに link_id 主キーを追加することは可能 (または必要) ではないと思います。通常、結合テーブルは、参加している 2 つのテーブルの主キーで構成されます。

XML を使用すると、次のような構文が必要になります。

 <class name="Parent">
    ....
    <list name="children" table="link_table">
    <key column="parent_id"/>
    <many-to-many column="child_id"
        class="Children"/>
    </list>
    ...
 </class>

<class name="Child">
...
<list name="parents" inverse="true" table="link_table">
    <key column="child_id"/>
    <many-to-many column="parent_id"
        class="Parent"/>
</list>
...
</class>

注釈を使用する方が良いと思いますが。

于 2008-12-23T02:49:50.787 に答える
0

多対多のマップされた hibernate 列にフィールドを追加する 2 つの方法を提供する非常に優れたブログをオンラインで見つけました。伝統的に、多対多マッピングが新しいテーブルを提供することを期待しており、テーブルの FK がマップされます。しかし、それを微調整して、この結合されたテーブルにフィールド/列を追加する方法があります。

この結合されたテーブルには、PK が含まれているか、PK のない追加のフィールドが含まれている可能性があります。正確な実装については、このブログを参照してください ここを参照してください

また、例のように、テーブルに追加の PK が必要なので、新しいテーブル ParentChildren を宣言し、主キーを linkId として宣言します。親クラスと子クラスの多対多マッピングの注釈は上記の投稿から参照できるため、注釈付きの親子クラスのみを表示しています。

@Entity
@Table(name = "parent_children")
public class ParentChildren{
    @Id @GeneratedValue
    private long linkId;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "parent_id") 
    private Parent parent;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "children_id) 
    private Children children;

    // additional fields if you want
    private boolean activated;

    //getters and setters
    }
}

これにより、linkId を主キーとし、parent_id と children_id を外部キーとするマッピング テーブルが作成されます。主キーとして link_id を個別に使用する理由と、それをどのように使用するかを明確にしてください。

于 2016-10-21T07:34:52.250 に答える
0

既存のデータを持つ既存のデータベースでこれを簡単に実行できるかどうかはわかりません。通常、Hibernate は、最初に接続するときに独自のデータ スキーマを定義する方が適切です...

私は注釈を使って多対多を実行しただけですが、休止状態のドキュメントでは XML ベースの例が提供されていると思います:リンク テキスト

于 2008-12-23T00:33:08.287 に答える