【问题标题】:How to trigger the update on entity in spring data?如何触发春季数据中实体的更新?
【发布时间】:2017-11-05 20:56:27
【问题描述】:

我有两个实体员工和薪水,我希望在员工实体角色属性发生变化时更新我的​​薪水实体。 员工实体: emp_id 姓名 角色 薪资实体: ID emp_id 工资表

每当员工角色发生任何变化时,我都需要自动更新工资板。 我无法在 spring data/jpa 中获得正确的方法来实现这一点

【问题讨论】:

  • 如果你的薪水取决于角色,那么薪水应该是角色而不是员工的一部分。如果您的薪水是计算字段,则它不应该在数据库中,而是用于计算字段或服务。
  • @Snickers3192 role 是员工实体的字段。我还需要从员工表中评估其他一些字段,并希望在员工表有更新时更新我的​​薪水表
  • 我只是说你的数据库中不应该有任何计算字段。
  • 你只会有一个用 @Transactional 注释的服务,否则,你不应该在数据库中有任何像计算工资等的东西。任何纯粹由其他字段组合创建但不包含实际状态的字段都不应该在您的数据库中。

标签: spring spring-mvc jpa spring-data


【解决方案1】:

我假设你在EmployeeSalary 之间有一个@OneToOne 关系,所以你的Employee 实体有一个正确注释的salary 字段。例如:

@OneToOne(mappedBy="employee")
private Salary salary;

更多关于实体关系映射here

最简单的解决方案是您必须将此逻辑放在 role 设置器中。例如:

void setRole(Role newRole) { 
    this.role = newRole;
    updateSalary();
}

void updateSalary() { ... }

如果您没有该字段的 setter 方法(我不建议这样做),您可以使用 JPA 的 @PrePersist@PreUpdate 注释。例如:

@PrePersist
@PreUpdate
public void updateSalary() { ... }

这样updateSalary将在每次spring创建一个新的Employee实体或更新一个现有实体时被调用。更多关于生命周期回调的休眠实现here

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多