1

私は2つのテーブルAB単純なPKを持っています。

@Entity
public class A { 
    @Id
    public int idA;
}

@Entity
public class B { 
    @Id
    public int idB;
}

Aとの間の関係を単純に格納する新しいアソシエーションクラスABをB、複合PK idA+でマップしたいと思いidBます。とABの間の関係だけで、余分な列はありません。idAidB

AB単一のクラスを使用してマッピングすることは可能ですか?として、またはで使用するためだけに新しいABIdクラスを作成する必要はありません。また、またはで関連付けを使用してこれをマップしたくありません。@IdClass@EmbeddedIdAB@ManyToManyAB

4

2 に答える 2

3

なぜそのような結合テーブルをマップしたいのですか? A と B の間に ManyToMany 関連付けを使用するだけです。この結合テーブルは、A に含まれる B のリストに B を追加/削除するときに自動的に処理されます。

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e11402を参照してください。

本当にそうしたい場合は、2 つの ID を @Id 表記でマップするだけです。hibernate リファレンス ドキュメントで説明されているように、プライマリ クラスはエンティティ クラス自体 (シリアル化可能である必要があります) になります。これは Hibernate 固有であることに注意してください。

于 2011-10-17T11:57:03.123 に答える
0

@JBNizet の提案がうまくいけばいいですね。残念ながら、私が使用しているバージョン (3.3.1-GA) では採用できない古いバグがあります。

@IdClass内部静的 ID クラスを定義し、それを次のように使用して、最終的にこれを整理しました。

@Entity
@Table(name="TABLE_AB")
@IdClass(value=ClassAB.ClassABId.class)
public class ClassAB implements Serializable {

    private String idA;
    private String idB;

    @Id
    public String getIdA(){ return idA; }
    public void setIdA(String idA){ this.idA = idA; }

    @Id
    public String getIdB(){ return idB; }
    public void setIdB(String idB){ this.idB = idB; }

    static class ClassABId implements Serializable {
        private String idA;
        private String idB;

        @Column(name="ID_A")
        public String getIdA(){ return idA; }
        public void setIdA(String idA){ this.idA = idA; }

        @Column(name="ID_B")
        public String getIdB(){ return idB; }
        public void setIdB(String idB){ this.idB = idB; }

        // HashCode(), equals()
    }
}

この方法では、新しいパブリック クラスを定義する必要がなく、マッピング ファイルを変更して ID クラスを含める必要もありません。

于 2011-10-17T15:34:49.757 に答える