映射仅包含没有@IdClass或@EmbeddedId的复合PK的类

时间:2011-10-17 11:36:41

标签: java hibernate hibernate-mapping hibernate-annotations

我有两张表AB,只有简单的PK。

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

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

我想映射一个新的关联类AB,它只存储AB之间的关系,复合PK idA + idBAB没有任何额外的列,只有idAidB之间的关系。

是否可以使用单个类映射AB?我想避免创建一个新的ABId类,只是在@IdClass中将其用作@EmbeddedIdAB,我不想将其与{ {1}}或@ManyToMany上的{1}}关联。

2 个答案:

答案 0 :(得分:3)

为什么要映射这样的连接表?只需使用A和B之间的ManyToMany关联。当您在A中包含的B列表中添加/删除B时,将自动处理此连接表。

请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e11402

如果您真的想这样做,那么只需使用@Id表示法映射这两个ID。主要类将是实体类本身(必须是可序列化的),如hibernate reference documentation中所述。请注意,这是特定于Hibernate的。

答案 1 :(得分:0)

如果@JBNizet的suggestion工作,那就太好了。不幸的是,有一个old bug使我无法在我使用的版本中采用它(3.3.1-GA)

我最终通过定义内部静态ID类并将其用作@IdClass来对其进行排序:

@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类。