【问题标题】:Hibernate 5: Auto updated timestamp field for last modifiedHibernate 5:上次修改的自动更新时间戳字段
【发布时间】:2016-12-05 08:23:40
【问题描述】:

我在 Hibernate 5 中有一个实体,它有创建和最后修改的时间戳。我希望他们获得自动更新。

/**
 * Time of creation of entity
 */
@Column(name = "created_on", nullable = false)
private Timestamp createdOn;

/**
 * Time of last update
 */
@Column(name = "last_update", nullable = false)
private Timestamp lastUpdate;

我是用 Hibernate 4 做的,使用映射 xml 文件如下:

    <property name="createdOn" type="java.sql.Timestamp" generated="insert" not-null="true">
        <column name="created_on" sql-type="timestamp" default="CURRENT_TIMESTAMP"/>
    </property>
    <property name="lastUpdate" type="java.sql.Timestamp" generated="always" not-null="true">
        <column name="last_update" sql-type="timestamp" default="CURRENT_TIMESTAMP"/>
    </property>

但不知道如何在 Hibernate 5 中使用注释。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    方法一:

    您可以使用以下内容:

    @PrePersist
    protected void onCreate() {
    createdOn = new Date();
    }
    
    @PreUpdate
    protected void onUpdate() {
     lastUpdate = new Date();
    }
    

    注意:如果您使用 Session API,JPA 回调将不起作用。

    方法二:

    您可以使用@Version 注释来注释lastUpdate 字段。除了自动填充字段外,它还将为实体引入乐观锁定。对于createdOn字段,只需在实体的默认构造函数中初始化即可。

    方法三:

    使用事件监听器并手动更新相关属性。您需要创建一个扩展 DefaultSaveOrUpdateEventListener 的侦听器并覆盖 onSaveOrUpdate 方法。不要忘记注册事件监听器。

    方法四: 您还可以分别对createdOnlastUpdate 字段使用@CreationTimestamp@UpdateTimestamp 注释。

    【讨论】:

    • Hibernate 5.2 是否支持 PrePersist 和 PreUpdate?
    • 我的实体由 web 客户端以 json 的形式提供,我将其反序列化为 POJO。所以我不想从客户端设置创建和更新时间,而服务器应该自己做。但是这些方法都不起作用。
    • @PrePersist@PreUpdate 受 Hibernate 5.2 支持 如果您在 JSON 中获得的值与托管实体中当前的值不同,则 @Version 不会更新带注释的字段。
    • 如果来自客户端的值为 null 怎么办?
    • 检查已编辑答案中的方法 4。这可能更直接和易于使用。详情请查看link
    【解决方案2】:

    值得使用setter方法

    public void setLastUpdate ( TimeStamp lastu ) {
       this.lastUpdate = lastu == null ? 0 : new Date);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2012-11-14
      • 1970-01-01
      相关资源
      最近更新 更多