日付フィールドが他のエンティティの状態に依存している場合、日付フィールドを維持し、できればその値を永続化する必要があるという問題に遭遇しました。JPA2 + Hibernate + Springでこの問題に対処する正しい方法は何ですか?
Parent
基本的に、3 つのエンティティがあり、それらを 、Child
、および と呼びましょうConf
。はdependentDate
、他のエンティティの状態に依存する複雑なビジネス ルールによって計算されます。具体的には、土日祝日を除くすべての日をスキップしてParent#date
マイナスにする必要があります (永続データ)。Conf#delay
問題は、Parent#date
が変更されるたびに、すべての子のdependentDate
を再計算する必要があることです。Child
これは、オブジェクトconf
が変更されるたびに発生するはずです。現在、オブジェクトの関係に基づいて新しい日付を計算するサービス メソッドがありChild
ます (これを と呼びましょうcalculateDate()
)。
フィールドの値をどこで計算するかという問題に直面しています。私は3つの可能な解決策を思いつきました。他のエンティティの状態に依存するエンティティのフィールドを更新する好ましい方法は、次のうちどれですか?
- JPA
EntityListener
- EntityListeners は他のエンティティにアクセスしてはならないため、これは JPA2 仕様では推奨されていません。
- フィールドは常に正しいでしょう
- 更新する 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
}