You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hibernate更新表时update_timestamp未自动更新问题排查

问题:Hibernate更新后MySQL的update_timestamp字段未自动更新

MySQL表结构

CREATE TABLE `test_table` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `ref_id` bigint(20) NOT NULL,
  `count` int(11) DEFAULT NULL,
  `status` tinyint(4) NOT NULL,
  `create_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

对应的POJO类

@Entity
@Data
@Table(name = "test_table")
public class TestTable implements Serializable {
    private static final long serialVersionUID = 4273269337137129245L;

    @Id
    @Column(name = "id")
    @GenericGenerator(name = "assigned-identity", strategy = "com.paytm.pgplus.datasource.custom.AssignedIdentityGenerator")
    @GeneratedValue(generator = "assigned-identity", strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "ref_id")
    private Long refId;

    @Column(name = "count")
    private Integer count;

    @Column(name = "status")
    @Enumerated(EnumType.ORDINAL)
    private Status status;

    @Column(name = "create_timestamp")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTimeStamp;

    @Column(name = "update_timestamp")
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTimeStamp;
}

使用Hibernate更新该表的status字段时,更新操作成功,但update_timestamp字段并未像预期那样随字段更新自动更新,请问问题出在哪?


原因及解决办法

问题根源

POJO类中映射了update_timestamp字段,Hibernate执行更新语句时,会把该字段当前的旧值写回数据库,直接覆盖了MySQL自带的ON UPDATE CURRENT_TIMESTAMP自动更新逻辑,导致数据库的自动更新机制失效。

解决方式

方式一:让Hibernate放弃维护该字段

在updateTimeStamp字段的@Column注解中添加updatable = false属性,告诉Hibernate不要在更新操作中处理这个字段,完全交由MySQL维护自动更新:

@Column(name = "update_timestamp", updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date updateTimeStamp;

方式二:改用Hibernate自带的时间注解维护

使用Hibernate的@CreationTimestamp和@UpdateTimestamp注解,让框架自动维护创建和更新时间,此时可以去掉MySQL表中对应的DEFAULT和ON UPDATE配置,避免双重触发:

@Column(name = "create_timestamp")
@CreationTimestamp
private Date createTimeStamp;

@Column(name = "update_timestamp")
@UpdateTimestamp
private Date updateTimeStamp;

方式三:手动设置更新时间(不推荐)

在执行更新操作前,手动将updateTimeStamp设置为当前时间,这种方式需要在业务代码中额外处理,可靠性不如依赖数据库或框架自动维护。


内容的提问来源于stack exchange,提问作者Naveen Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:55:16