【问题标题】:Implementing "touch" on JPA entity?在 JPA 实体上实现“触摸”?
【发布时间】:2011-09-03 09:27:41
【问题描述】:

在我们的基础实体类(所有实体都派生自)中,除其他外,我们有 2 个方法。一个用@PrePersist注释,基本上只设置dateCreated,另一个用@PreUpdate注释,设置dateUpdated字段。

这非常有效,因为我们不希望在创建时设置 dateUpdated 字段。作为设计的一部分,我们还创建了两个方法protected,这样其他开发人员就不会去明确地弄乱这两个日期(也没有设置器)。

此外,我们可以通过在实际实体上定义一个方法并使用@PrePersist 对其进行注释,从而轻松地扩展任何实体以在创建时设置dateUpdated 字段,因此这部分已涵盖。

现在,我目前的问题是,有一种情况我们想显式更新实体上的 dateUpdated 字段,而不更改其上的任何数据(基本上是 touch 它)。有没有一种优雅的方式来做到这一点?我真的不想实现一种更改其中一个字段然后将其更改回来的方法。而且我们希望继续拥有没有这些字段的 setter 方法的实体。

谢谢!

【问题讨论】:

    标签: java mysql hibernate jpa


    【解决方案1】:

    使用 @Version 注释您的 dateUpdated 字段,删除 preUpdate 回调并在提交事务之前使用 em.lock(entity, LockModeType.WRITE)。请记住,需要管理实体以强制更新版本列

    【讨论】:

    • 我认为这对我们不起作用。我们已经在实体上有一个版本字段。另外,版本字段并不是严格意义上的日期,它是一个表示为日期的整数。
    【解决方案2】:

    您是否尝试过仅更改 dateUpdated 字段值?我想这应该使实体修改为 Hibernate,而 Hibernate 将调用 @PreUpdate 方法将 dateUpdated 字段设置回当前时间:

    public void touch() {
        this.dateUpdated = -1;
    }
    

    【讨论】:

    • 好东西。我实际上只是记得以前读过这个。试试看,谢谢。
    • 完美运行,谢谢! (除了不能做 this.dateUpdated = -1 因为你不能将 int 分配给 Date 字段,但 this.dateUpdated = null 工作 100%)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多