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

如何在Oracle数据库UPDATE时自动将SYSDATE注入dat_update字段

解决Oracle自动更新dat_update字段为SYSDATE的问题

你的需求是每次执行UPDATE操作时让dat_update字段自动获取Oracle数据库的当前日期,之前用@ColumnTransformer未生效,主要是配置有误,下面给你梳理几种可行方案:

方案1:数据库层面实现(最可靠,不依赖ORM)

直接在数据库端配置默认值+更新触发器,无论用什么工具操作数据库都能生效:

  • 先修改表结构,给dat_update设置默认值:
ALTER TABLE 你的表名 MODIFY dat_update DEFAULT SYSDATE;
  • 创建UPDATE触发器,每次更新时自动刷新字段值:
CREATE OR REPLACE TRIGGER trg_update_dat_update
BEFORE UPDATE ON 你的表名
FOR EACH ROW
BEGIN
    :NEW.dat_update := SYSDATE;
END;
/

方案2:修正@ColumnTransformer配置

你之前的write = "?"代表使用传入的Java对象值,并不会自动调用Oracle的SYSDATE。调整配置让Hibernate在更新时直接使用数据库时间:

@Column(name = "dat_update")
@ColumnTransformer(
    read = "SYSDATE",
    write = "SYSDATE"
)
private ZonedDateTime lastUpdatedAt;

配置后不需要在代码里手动给lastUpdatedAt赋值,Hibernate生成UPDATE语句时会自动将dat_update设为Oracle的当前日期。

方案3:Hibernate @PreUpdate注解(应用端时间)

如果可以接受使用应用服务器的时间而非数据库时间,用@PreUpdate更简洁:
在实体类中添加如下方法:

@PreUpdate
public void setLastUpdatedAt() {
    this.lastUpdatedAt = ZonedDateTime.now();
}

每次执行UPDATE操作前,Hibernate会自动调用该方法,给字段赋值当前时间。

三种方案里优先推荐方案1,它不依赖任何ORM框架,能确保所有数据库操作场景下字段都能自动更新;如果要在代码层面处理,可根据是否需要数据库时间选择方案2或3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:45:48