3

当我在 @Embeddable 中使用 JPA @Version 注释时,我得到以下指向我的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 是特定的?

4

1 回答 1

6

可嵌入类只是声明可重用实体元素的一种方便方式,即您Updateable可以在其他实体中使用而无需再次添加字段和映射。

因此,嵌入式是实体的一部分(顾名思义它们是嵌入式的),因此独立的版本控制没有意义。

仅将注释添加@Version到可嵌入对象也没有多大意义,因为可嵌入对象本身无法进行版本控制,并且您必须处理单个实体中包含多个可嵌入对象的情况(例如,在这种情况下应该使用哪个版本?)。因此,由于@Version仅对实体有意义,因此只允许对实体或映射的超类进行注释会更容易。

实际上,尽管 JPA 规范建议版本属性是数字、字符串或时间戳,但 Hibernate 似乎提供了用户定义的版本类型

版本列可以是数字(推荐的解决方案)或时间戳。Hibernate 支持任何类型的类型,只要您定义和实现适当的 UserVersionType。

因此,如果您想用作您的版本,您可能能够做的(未经测试,只是从文档中得出)Updateable是提供一个自定义用户类型Updateable,然后像这样使用它:

@Entity
public class SomeEntity  {
  @Id
  private Long id;

  @Type( "your.custom.UserVersionType" )
  @Version
  private Updateable updateAudit;

  // other stuff
}
于 2014-07-03T10:53:51.010 回答