我是Hibernate和JPA的新手,我很难设置如下定义的复合键:
@Entity
@Table(name = Entity.TABLE)
@IdClass(EntityPK.class)
public class MyEntity extends Entity {
@CollectionOfElements
@JoinTable(name="items",
joinColumns = @JoinColumn(name="items"))
private List<String> items;
@Id
private Type type;
@Id
private Level level;
// plus standard constructors/getters/setters
}
public class EntityPK implements Serializable {
private Type type;
private Level level;
// plus standard constructors/getters/setters
}
当我运行dbunit测试时,出现以下错误:
引起:org.hibernate.AnnotationException:从com.tnt.sech.domain.management.ReasonList引用com.tnt.sech.domain.management.ReasonList的外键具有错误的列数。应该是2
如果你能看到我出错的地方,请发帖!
答案 0 :(得分:3)
在我看来,问题在于你不能使用复杂类型,如Type
和Level
(不确定它们是什么)作为复合键的字段或属性。从JPA规范:
2.1.4主键和实体标识
...
主键(或字段或属性 一个复合主键)应该是 以下类型之一:任何Java 原始类型;任何原始包装器 类型;
java.lang.String
;java.util.Date
;java.sql.Date
即可。在 但是,一般是近似数字 类型(例如,浮点类型) 永远不应该在主键中使用。 主键使用类型的实体 除了这些将不可携带。 如果使用生成的主键, 只有整体类型才能携带。 如果使用java.util.Date
作为 主键字段或属性, 时间类型应指定为DATE
。
它们到底是什么(枚举?)?
除此之外,映射复合键本身的方法还可以(参见下面的相关问题)。