仅当记录通过数据修改而更新时才更新日期
Posted
技术标签:
【中文标题】仅当记录通过数据修改而更新时才更新日期【英文标题】:Update date only if record updated with data modification 【发布时间】:2018-09-23 15:23:15 【问题描述】:我正在为我的项目使用 Oracle JPA。在我的项目中,我们接收文件并将记录插入或更新(如果修改了任何字段值)到数据库表中。 有可能在没有修改字段值的情况下收到重复的(已收到的)记录。
我的需要是
-
如果收到的相同记录没有任何更改,则不应更新日期列。
如果新记录或相同记录有任何修改,日期列应更新。
举个例子
第一次插入:
要插入的记录:
EmpID | Name | Designation | Salary
=========================================
00001 | Raj | Team Lead |600000
00002 | Kumar | Developer |400000
插入后的表格:
Emp ID | Name | Designation | Salary | DATE
===========================================================
00001 | Raj | Team Lead | 600000 | 12-04-2018 01:00:00
00002 | Kumar | Developer | 400000 | 12-04-2018 01:00:00
第二次插入:
要插入的记录:
EmpID | Name | Designation | Salary
==============================================
00001 | Raj | Team Lead |600000
00002 | Kumar | Senior Developer |500000
插入/更新后的表格:
Emp ID | Name | Designation | Salary | DATE
===========================================================
00001 | Raj | Team Lead | 600000 | 12-04-2018 01:00:00
00002 | Kumar | Senior Developer | 500000 | 13-04-2018 01:00:00
这里只发送更改的行日期,因为它只是真正修改过的。
在代码中执行此验证是一项繁琐的任务。请说是否有任何可能的解决方案。
【问题讨论】:
我会计算数据的哈希值并检查它是否与在更新前触发器中对表数据计算的相同哈希值不同,如果是,则更新,否则跳过 How to autogenerate created or modified timestamp field?的可能重复 【参考方案1】:你需要一个监听器来设置当前时间
public class BaseEntityListener
@PreUpdate
public void preUpdate(BaseEntity entity)
Date date = new Date();
entity.setUpdateDate(date);
这是模型定义:
@SuppressWarnings("serial")
@MappedSuperclass
@EntityListeners(BaseEntityListener.class)
public class BaseEntity implements java.io.Serializable
@Basic(optional = false)
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updateDate")
private Date updateDate;
并更新实体使用
entityManager.merge(model);
entityManager.flush();
updateDate 将在任何列更改时更新。未更改列时不会更新。
【讨论】:
此外,BaseEntity
类应使用@MappedSuperclass
进行注释并定义为abstract
。此外,不需要使用带有 optional=false
的 @Basic
注释以及带有 nullable=false
注释的 @Column
。以上是关于仅当记录通过数据修改而更新时才更新日期的主要内容,如果未能解决你的问题,请参考以下文章