1

我有两张桌子AB简单的PK。

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

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

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

AB是否可以使用单个类进行映射?我想避免创建一个新ABId类只是为了将它用作@IdClassor @EmbeddedIdin AB,并且我不想将它与or的@ManyToMany关联映射。AB

4

2 回答 2

3

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

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

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

于 2011-10-17T11:57:03.123 回答
0

如果@JBNizet 的建议有效,那就太好了。不幸的是,有一个旧错误导致无法在我正在使用的版本中采用它(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 类。

于 2011-10-17T15:34:49.757 回答