仅在使用数据修改

时间:2018-04-13 09:50:03

标签: java oracle jpa updates

我正在为我的项目使用Oracle JPA。在我的项目中,我们接收文件,并将记录插入或更新(如果有任何字段值修改)到数据库表中。 有可能在没有字段值修改的情况下接收重复(已接收)记录。

我的需要是

  1. 如果收到的相同记录没有任何更改,则不应更新日期列。
  2. 如果新记录或相同记录有任何修改,则日期列应更新。
  3. 作为一个例子

    首先插入:

    要插入的记录:

    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
    

    此处仅发送行日期,因为它只是真正修改过。

    在代码中执行此验证是一项繁琐的任务。请说有任何可能的解决方案。

1 个答案:

答案 0 :(得分: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。没有列更改时,它不会更新。