当我在@Embeddable中使用JPA @Version annotaton时,我得到以下异常指向我的Updateable
类:
org.hibernate.AnnotationException: Unable to define @Version on an embedded class
这是我的代码:
@Embeddable
public class Updateable {
@Version
private long modcount;
private String updatedBy;
private DateTime updatedAt;
// getters & setters
}
@Entity
public class SomeEntity {
@Id
private Long id;
@Embedded
private Updateable updateAudit;
// other stuff
}
@Embeddable中是否不可能有@Version,或者这个Hibernate是否具体?
答案 0 :(得分:4)
可嵌入类只是一种声明可重用实体元素的便捷方式,即您可以在其他实体中使用Updateable
,而无需再次添加字段和映射。
因此,embeddables是实体的一部分(顾名思义它们是嵌入式的),因此独立版本化没有意义。
仅将@Version
注释添加到embeddable也没有多大意义,因为embeddable本身无法进行版本控制,并且您必须处理多个嵌入包含在单个实体中的情况(例如在这种情况下应该使用哪个版本?)。因此,@Version
仅对实体有意义,因此更容易为实体或映射的超类提供注释。
实际上虽然JPA规范建议版本属性是数字,Hibernate似乎提供字符串或时间戳user defined version types:
版本列可以是数字(推荐的解决方案)或时间戳。 Hibernate支持任何类型,只要您定义并实现适当的UserVersionType。
因此,如果您想使用Updateable
作为您的版本提供Updateable
的自定义用户类型然后使用,那么您可以执行的操作(未经测试,仅来自文档)它是这样的:
@Entity
public class SomeEntity {
@Id
private Long id;
@Type( "your.custom.UserVersionType" )
@Version
private Updateable updateAudit;
// other stuff
}