@Embeddable 类中的 JPA @Version

mox*_*xim 2 java jpa version embeddable

当我在 @Embeddable 中使用 JPA @Version 注释时,我得到以下指向我的Updateable类的异常:

org.hibernate.AnnotationException: Unable to define @Version on an embedded class
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

org.hibernate.AnnotationException: Unable to define @Version on an embedded class
Run Code Online (Sandbox Code Playgroud)
@Embeddable
public class Updateable {
    @Version
    private long modcount;

    private String updatedBy;

    private DateTime updatedAt;

    // getters & setters
}
Run Code Online (Sandbox Code Playgroud)

在@Embeddable 中不可能有@Version,还是这个Hibernate 特定的?

Tho*_*mas 5

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

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

@Version仅将注释添加到 embeddable 也没有多大意义,因为 embeddable 本身无法进行版本控制,并且您必须处理单个实体中包含多个 embeddable 的情况(例如,在这种情况下应该使用哪个版本?)。因此,由于@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
}
Run Code Online (Sandbox Code Playgroud)