gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:22:51 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com