java - 如何将更新的实体与旧实体进行比较并仅将更新的值存储在数据库中

标签 java hibernate jpa spring-rest

我正在使用 Spring Boot + Rest + Jpa 。因此,如果用户编辑映射到员工表的任何员工实体(empId、薪水、年龄、位置、角色、经验)列,我应该跟踪旧的和新的更改并输入审核表,其中列已更改。

public EmployeeEntity update(int empId, EmployeeEntity employeeEntity ) {

    em = emf.createEntityManager();
    EmployeeEntity beforeObj = em.find(EmployeeEntity .class,empId );

    try {
        em.getTransaction().begin();
        em.merge(employeeEntity);
        em.getTransaction().commit();
    }
    finally {
        em.close();
    }

    return employeeEntity;
}

所以现在我有带有 beforeObj (具有旧值的员工实体)和 employeeEntity (更新值)的实体,因此例如仅更新工资和位置,我必须跟踪这些实体并在审计表中进行更新。需要比使用 Envers 或任何其他 JPA 工具简单得多,因为只能发生最少的事务。

这是我的实体类:

@Entity
@Table(name = "TEMPLOYEE")
public class EmployeeEntity implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "EMP_NO")
private int EMP_NO;

@Column(name = "SALARY_VAL")
private int SALARY_VA;

@Column(name = "ROLE_NAME")
private String ROLE_NAME;

@Column(name = "EXPERIENCE")
private int EXPERIENCE;

@Column(name = "LOCATION")
private String LOCATION;

// Getters and Setters

同样需要见解。

最佳答案

虽然 @Tobb 已经提交了可靠的答案,但如果员工记录的更改需要在实际生效之前获得批准,您还可以采取另一条途径。您可以将“审核”表实现为“员工历史记录”,其中“员工历史记录”包含“员工”执行的每一列以及用于跟踪谁更改了哪些数据以及何时更改的列。您可以使用“过期时间戳”和“Activity 时间戳”列来跟踪哪个“历史”记录应与真实“员工”表中的 Activity 记录匹配。

然后,当普通用户对员工记录进行更改时,更改的记录仅保存到“员工历史”表中,并且可以触发“审核请求”以提醒需要审核和批准的人更改,以便更改可以写入真正的“Employee”表。当审核者进行审核时,“历史记录”表将包含旧的未更改的员工历史记录(具有 NULL 过期时间戳和最近 Activity 时间戳的记录)和新建议的更改员工历史记录(两者都过期的记录)和 Activity 时间戳 NULL)。审核者审核后,旧的未更改的员工历史记录将具有当前过期时间戳,新更新的员工历史记录将具有 NULL 过期时间戳和最近的 Activity 时间戳。新更新的员工历史记录也将与更新的关联员工记录相匹配。

关于java - 如何将更新的实体与旧实体进行比较并仅将更新的值存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46368175/

相关文章:

java - 将android项目添加到git

java - 如何将通过 REST URL 请求下载的文件保存到某个文件夹?

java - 将 Weka 导入 Eclipse

java - hibernate 级联来拯救 parent 和 child

java - JPA/Hibernate 单向 OneToMany 为 'mappedBy'

jpa - 如何调用命名查询

java - 当两个单独的模式具有相同的命名空间时,如何告诉 JAXB 在单独的包中生成类?

java - 我是否正确地将 Hibernate 与 Hikari 一起使用?

hibernate - 从我的 Grails 应用程序访问本地存储的文件?

java - 返回更新的实体后出现 LazyInitializationException