如何在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
相关产品推荐
相关产品推荐

