我们遇到了一个问题,我们必须维护一个日期字段 - 并且最好保留它的值 - 其中日期字段取决于其他实体的状态。用 JPA2 + Hibernate + Spring 解决这个问题的正确方法是什么?
基本上,我们有三个实体,我们称它们Parent
为 、Child
和Conf
。dependentDate
由依赖于其他实体状态的复杂业务规则计算得出。具体来说,应该Parent#date
减去Conf#delay
跳过周末或节假日的所有日子(持久数据)。
问题是每当Parent#date
发生变化时,所有孩子的dependentDate
s 都应该重新计算。每当Child
对象conf
更改时,这也应该发生。目前,有一种基于Child
对象关系计算新日期的服务方法(我们称之为calculateDate()
)。
我们面临着应该在哪里计算字段值的问题。我想出了三个可能的解决方案。其中哪一个 - 或者可能是其他东西 - 是更新依赖于其他实体状态的实体字段的首选方式?
- 一个 JPA
EntityListener
- 这在 JPA2 规范中是不鼓励的,因为 EntityListeners 不应该访问其他实体
- 该字段将始终正确
- 更新的 Spring AOP 方面
- 逻辑隐藏在其他类中,不容易看到
- 切入点无法捕获所有持久/更新事件的风险
- 每个开发者为自己
- 总是,当更新父类或子类的实例时,开发人员必须记住调用服务的
calculateDate()
方法 - 这应该在dao还是服务层?
- 开发者忘记添加调用,导致错误状态的风险
- 总是,当更新父类或子类的实例时,开发人员必须记住调用服务的
以下示例显示了省略注释配置的实体关系。
实体
public class Parent {
LocalDate date;
Set<Child> children; // one-to-many
}
public class Conf {
int delay;
}
public class Child {
LocalDate dependentDate;
Conf conf; // many-to-one
Parent parent; // many-to-one
}