【问题标题】:JPA @Version in @Embeddable class@Embeddable 类中的 JPA @Version
【发布时间】:2014-08-24 10:54:45
【问题描述】:

当我在 @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 是特定的?

【问题讨论】:

    标签: java jpa version embeddable


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!这不是我所希望的,但是当你从实体的角度考虑它时,这一切都是有道理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多