使用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
相关产品推荐
相关产品推荐

