生命週期事件

Spring Data JDBC 將生命週期事件釋出到 ApplicationListener 物件,這些物件通常是應用上下文中的 bean。事件是關於特定生命週期階段的通知。與實體回撥不同,事件旨在用於通知。事務性監聽器將在事務完成時接收事件。事件和回撥僅對聚合根觸發。如果您想處理非根實體,需要透過包含該非根實體的聚合根的監聽器來處理。

實體生命週期事件可能開銷很大,載入大型結果集時,您可能會注意到效能特徵發生變化。您可以透過 模板 API 停用生命週期事件。

例如,以下監聽器在聚合儲存之前被呼叫

@Bean
ApplicationListener<BeforeSaveEvent<Object>> loggingSaves() {

	return event -> {

		Object entity = event.getEntity();
		LOG.info("{} is getting saved.", entity);
	};
}

如果您只想處理特定領域型別的事件,可以將監聽器派生自 AbstractRelationalEventListener 並覆蓋一個或多個 onXXX 方法,其中 XXX 代表事件型別。回撥方法僅對與該領域型別及其子型別相關的事件呼叫,因此您無需進行額外的型別轉換。

class PersonLoadListener extends AbstractRelationalEventListener<Person> {

	@Override
	protected void onAfterLoad(AfterLoadEvent<Person> personLoad) {
		LOG.info(personLoad.getEntity());
	}
}

下表描述了可用的事件。有關處理步驟之間確切關係的更多詳細資訊,請參閱與事件一對一對映的可用回撥描述

表 1. 可用事件
事件 何時釋出

BeforeDeleteEvent

在聚合根被刪除之前。

AfterDeleteEvent

在聚合根被刪除之後。

BeforeConvertEvent

在聚合根被轉換為執行 SQL 語句的計劃之前,但在決定聚合是否是新的(即是更新還是插入)之後。

BeforeSaveEvent

在聚合根被儲存之前(即插入或更新,但在決定是插入還是更新之後)。

AfterSaveEvent

在聚合根被儲存之後(即插入或更新)。

AfterConvertEvent

在從資料庫 ResultSet 建立聚合根並設定所有屬性之後。

生命週期事件依賴於 ApplicationEventMulticaster,對於 SimpleApplicationEventMulticaster 來說,它可以配置一個 TaskExecutor,因此無法保證事件何時被處理。

特定於儲存的實體回撥

Spring Data JDBC 使用 EntityCallback API 進行審計支援,並對下表中列出的回撥做出反應。

表 2. Spring Data JDBC 執行的不同過程的處理步驟和回撥。
過程 EntityCallback / 處理步驟 註釋

刪除

BeforeDeleteCallback

實際刪除之前。

聚合根及其所有實體都將從資料庫中移除。

AfterDeleteCallback

聚合被刪除之後。

儲存

根據聚合是否是新的來決定是執行插入還是更新操作。

BeforeConvertCallback

如果您想以程式設計方式設定 ID,這是正確的回撥。在上一步中,新的聚合已被檢測出來,在此步驟中生成的 ID 將會在下一步中使用。

將聚合轉換為聚合更改,這是一系列將要對資料庫執行的 SQL 語句。在此步驟中,決定 ID 是由聚合提供,還是 ID 仍然為空並期望由資料庫生成。

BeforeSaveCallback

對聚合根的更改可能會被考慮,但是否將 ID 值傳送到資料庫的決定已在上一步中做出。不要使用此回撥為新聚合建立 ID。請改用 BeforeConvertCallback

上面確定的 SQL 語句將對資料庫執行。

AfterSaveCallback

在聚合根被儲存之後(即插入或更新)。

載入

使用一個或多個 SQL 查詢載入聚合。從結果集中構建聚合。

AfterConvertCallback

我們鼓勵使用回撥而非事件,因為回撥支援使用不可變類,因此比事件更強大、更靈活。