ライフサイクルイベント

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 をイベントにマップする使用可能なコールバックの説明を参照してください。

表 1: 利用可能なイベント
イベント 公開されたとき

BeforeDeleteEvent (Javadoc)

集約ルートが削除される前。

AfterDeleteEvent (Javadoc)

集約ルートが削除された後。

BeforeConvertEvent (Javadoc)

集約ルートが SQL ステートメントを実行するためのプランに変換される前、ただし集約が新しいかどうか、つまり更新または挿入が適切であるかどうかが決定された後。

BeforeSaveEvent (Javadoc)

集約ルートが保存される前(つまり、挿入または更新されるが、挿入または更新されるかどうかの決定が行われた後)。

AfterSaveEvent (Javadoc)

集約ルートが保存された(つまり、挿入または更新された)後。

AfterConvertEvent (Javadoc)

集約ルートがデータベース ResultSet から作成され、そのすべてのプロパティが設定された後。

ライフサイクルイベントは ApplicationEventMulticaster に依存します。SimpleApplicationEventMulticaster の場合、TaskExecutor を使用して構成できるため、イベントが処理されるときの保証はありません。

ストア固有の EntityCallbacks

Spring Data JDBC は監査サポートに EntityCallback API を使用し、次の表にリストされているコールバックに反応します。

表 2: Spring Data JDBC によって実行されるさまざまなプロセスのプロセスステップとコールバック。
処理 EntityCallback / プロセスステップ コメント

削除

BeforeDeleteCallback (Javadoc)

実際の削除の前。

集約ルートとその集約のすべてのエンティティがデータベースから削除されます。

AfterDeleteCallback (Javadoc)

集約が削除された後。

保存

集約が新規かどうかに応じて、集約の挿入または更新を実行するかどうかを決定します。

BeforeConvertCallback (Javadoc)

プログラムで ID を設定する場合、これは正しいコールバックです。前のステップでは、新しい集約がそのように検出され、このステップで生成された ID が次のステップで使用されます。

集約を集約の変更に変換します。これは、データベースに対して実行される一連の SQL ステートメントです。このステップでは、ID が集約によって提供されるか、ID がまだ空であり、データベースによって生成されることが期待されるかどうかが決定されます。

BeforeSaveCallback (Javadoc)

集約ルートに加えられた変更は考慮される場合がありますが、ID 値がデータベースに送信されるかどうかは前のステップですでに決定されています。新しい集約の ID を作成するためにこれを使用しないでください。代わりに BeforeConvertCallback を使用してください。

上記で決定された SQL ステートメントは、データベースに対して実行されます。

AfterSaveCallback (Javadoc)

集約ルートが保存された(つまり、挿入または更新された)後。

ロード

1 つ以上の SQL クエリを使用して集約をロードします。結果セットから集約を作成します。

AfterConvertCallback (Javadoc)

イベントは不変クラスの使用をサポートしているため、イベントよりも強力で用途が広いため、イベントに対してコールバックを使用することをお勧めします。