@Embeddable类中的JPA @Version

时间:2014-07-03 10:47:22

标签: java jpa version embeddable

当我在@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是否具体?

1 个答案:

答案 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
}