ライフサイクルイベント
Spring Data JDBC は、ライフサイクルイベントを ApplicationListener オブジェクト (通常はアプリケーションコンテキスト内の Bean) に発行します。イベントは、特定のライフサイクルフェーズに関する通知です。エンティティコールバックとは対照的に、イベントは通知を目的としています。トランザクションリスナーは、トランザクションが完了するとイベントを受信します。イベントとコールバックは、集約ルートに対してのみトリガーされます。非ルートエンティティを処理したい場合は、それを含む集約ルートのリスナーを介して処理する必要があります。
エンティティライフサイクルイベントはコストがかかる可能性があり、大きな結果セットをロードするときにパフォーマンスプロファイルの変化に気付く場合があります。テンプレート API でライフサイクルイベントを無効にすることができます。
例: 集約が保存される前に、次のリスナーが呼び出されます。
@Bean
ApplicationListener<BeforeSaveEvent<Object>> loggingSaves() {
return event -> {
Object entity = event.getEntity();
LOG.info("{} is getting saved.", entity);
};
} 特定のドメイン型のイベントのみを処理する場合は、リスナーを AbstractRelationalEventListener から派生させ、1 つまたは複数の onXXX メソッドを上書きすることができます。ここで、XXX はイベント型を表します。コールバックメソッドは、ドメイン型とそのサブ型に関連するイベントに対してのみ呼び出されるため、さらにキャストする必要はありません。
class PersonLoadListener extends AbstractRelationalEventListener<Person> {
@Override
protected void onAfterLoad(AfterLoadEvent<Person> personLoad) {
LOG.info(personLoad.getEntity());
}
}次の表で、使用可能なイベントについて説明します。プロセスステップ間の正確な関係の詳細については、1:1 をイベントにマップする使用可能なコールバックの説明を参照してください。
| イベント | 公開されたとき |
|---|---|
集約ルートが削除される前。 | |
集約ルートが削除された後。 | |
集約ルートが SQL ステートメントを実行するためのプランに変換される前、ただし集約が新しいかどうか、つまり更新または挿入が適切であるかどうかが決定された後。 | |
集約ルートが保存される前(つまり、挿入または更新されるが、挿入または更新されるかどうかの決定が行われた後)。 | |
集約ルートが保存された(つまり、挿入または更新された)後。 | |
集約ルートがデータベース |
ライフサイクルイベントは ApplicationEventMulticaster に依存します。SimpleApplicationEventMulticaster の場合、TaskExecutor を使用して構成できるため、イベントが処理されるときの保証はありません。 |
ストア固有の EntityCallbacks
Spring Data JDBC は監査サポートに EntityCallback API を使用し、次の表にリストされているコールバックに反応します。
| 処理 | EntityCallback / プロセスステップ | コメント |
|---|---|---|
削除 | 実際の削除の前。 | |
集約ルートとその集約のすべてのエンティティがデータベースから削除されます。 | ||
集約が削除された後。 | ||
保存 | 集約が新規かどうかに応じて、集約の挿入または更新を実行するかどうかを決定します。 | |
これは、プログラムで ID を設定する場合の正しいコールバックです。前のステップで新しい集約が検出され、このステップで生成された ID が次のステップで使用されます。 | ||
集約を集約変更に変換します。これは、データベースに対して実行される一連の SQL 文です。このステップでは、集約によって ID が提供されるかどうか、ID がまだ空でデータベースによって生成されるかどうかが判断されます。 | ||
集約ルートに加えられた変更は考慮される場合がありますが、ID 値がデータベースに送信されるかどうかは前のステップですでに決定されています。新しい集約の ID を作成するためにこれを使用しないでください。代わりに | ||
上記で決定された SQL ステートメントは、データベースに対して実行されます。 | ||
集約ルートが保存された(つまり、挿入または更新された)後。 | ||
ロード | 1 つ以上の SQL クエリを使用して集約をロードします。結果セットから集約を作成します。 | |
イベントは不変クラスの使用をサポートしているため、イベントよりも強力で用途が広いため、イベントに対してコールバックを使用することをお勧めします。
The delete and save related callbacks do not get invoked for derived query methods or annotated queries. In general Spring Data JDBC does not have an efficient way to determine what aggregates are affected by these operations and therefore can’t provide callbacks or events.