我有一个只包含2个字段的表。 该表具有由这两个字段构成的复合PK。
当使用NetBeans创建数据库从实体bean,则不会创建实体bean自动像有2个以上领域的其他表。
所以我想我需要创建实体bean自己。 什么是创建这个实体bean的最佳实践? 是否有含有COMPOSITE KEY
的对象或不是?
我有一个只包含2个字段的表。 该表具有由这两个字段构成的复合PK。
当使用NetBeans创建数据库从实体bean,则不会创建实体bean自动像有2个以上领域的其他表。
所以我想我需要创建实体bean自己。 什么是创建这个实体bean的最佳实践? 是否有含有COMPOSITE KEY
的对象或不是?
所以我真的不能说一下它的映射工具产生任何影响,我不使用NetBeans。
映射组合键,有几个选项。 您可以
定义一个单独的@Embeddable
对象与PK场,并用它作为@EmbeddedId
在@Entity
类
@Embeddable public class MyCompositePK { @Column private String fieldA; @Column private String fieldB; } @Entity public class MyBean { @EmbeddedId private MyCompositePK id; @Column private String fieldC; }
限定非映射POJO与PK字段,并用它作为@IdClass
在@Entity
。
@Entity @IdClass(value=ClassAB.ClassABId.class) public class ClassAB implements Serializable { private String idA; private String idB; @Id @Column(name="ID_A") public String getIdA(){ return idA; } public void setIdA(String idA){ this.idA = idA; } @Id @Column(name="ID_B") public String getIdB(){ return idB; } public void setIdB(String idB){ this.idB = idB; } static class ClassABId implements Serializable { private String idA; private String idB; public String getIdA(){ return idA; } public void setIdA(String idA){ this.idA = idA; } public String getIdB(){ return idB; } public void setIdB(String idB){ this.idB = idB; } // implement equals(), hashcode() } }
在这个例子中ClassABId
仅仅是出于方便的静态内部类。
这些选项在帕斯卡Thivent的出色答卷也解释了这个问题: 如何映射与Hibernate复合键? 。
此相关的问题讨论了这些方法之间的差异: 我应该使用哪种anotation:@IdClass或@EmbeddedId 。 注意字段的声明获取与复制@IdClass
方法。
总之,我不认为有创造两个类的替代品。 这就是为什么我问这个问题: 映射仅由无@IdClass或@EmbeddedId的复合PK的一类 。 这似乎有一个Hibernate的相关功能这一点。
作为一个侧面说明,如果你有控制权的DB结构,你也可以考虑避免组合键。 有一些理由这样做 。
感谢@XaviLópez。 你的解释我固定的代码被宣布由@汤姆安德森提到自己的IdClass。 当我声明为2分@Id列自己的IdClass,一个JPA查询获取该实体的名单正在恢复预计在结果列表中的“N”项,但该列表中的每个项目为空。 但是,大小“N”的预期。 更改为静态内部类,这是少重构后,其能够回到正确的一组结果。
据我:自参考IdClass不会工作,因为自我已经是一个实体,那么需要在持久化上下文。 如果我也有相同类型的一个主键对象,那么就会出现在持久性上下文2“相同的”对象。 因此,它不应该被允许。 因此,我们不应该使用自参考@IdClass。 创建静态内部类作为其是较少侵入主键类型。