对于最新的稳定版本,请使用 Spring Data Relational 3.3.1!

对于最新的稳定版本,请使用 Spring Data Relational 3.3.1!

Spring Data JDBC 将生命周期事件发布到对象,通常是应用程序上下文中的 Bean。 事件是关于某个生命周期阶段的通知。 与实体回调相比,事件用于通知。 事务侦听器将在事务完成时接收事件。 事件和回调仅针对聚合根触发。 如果要处理非根实体,则需要通过包含聚合根的侦听器来执行此操作。ApplicationListener

实体生命周期事件可能代价高昂,并且在加载大型结果集时,您可能会注意到性能配置文件发生了变化。 您可以在模板 API 上禁用生命周期事件。

例如,在保存聚合之前调用以下侦听器:

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

	return event -> {

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

如果只想处理特定域类型的事件,则可以从一个或多个方法派生侦听器并覆盖这些方法,其中 代表事件类型。 回调方法只会针对与域类型及其子类型相关的事件调用,因此不需要进一步强制转换。AbstractRelationalEventListeneronXXXXXX

class PersonLoadListener extends AbstractRelationalEventListener<Person> {

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

下表描述了可用事件。有关流程步骤之间确切关系的更多详细信息,请参阅将 1:1 映射到事件的可用回调的说明。

表 1.可用事件
事件 发布时间

BeforeDeleteEvent

在删除聚合根之前。

AfterDeleteEvent

删除聚合根目录后。

BeforeConvertEvent

在将聚合根转换为执行 SQL 语句的计划之前,但在决定聚合是否为新聚合之后,即是否需要更新或插入。

BeforeSaveEvent

在保存聚合根目录之前(即,插入或更新,但在决定是否插入或更新它之后)。

AfterSaveEvent

保存聚合根目录(即插入或更新)后。

AfterConvertEvent

从数据库创建聚合根目录并设置其所有属性后。ResultSet

生命周期事件依赖于 ,在这种情况下,可以用 配置 ,因此不能保证何时处理事件。ApplicationEventMulticasterSimpleApplicationEventMulticasterTaskExecutor
表 1.可用事件
事件 发布时间

BeforeDeleteEvent

在删除聚合根之前。

AfterDeleteEvent

删除聚合根目录后。

BeforeConvertEvent

在将聚合根转换为执行 SQL 语句的计划之前,但在决定聚合是否为新聚合之后,即是否需要更新或插入。

BeforeSaveEvent

在保存聚合根目录之前(即,插入或更新,但在决定是否插入或更新它之后)。

AfterSaveEvent

保存聚合根目录(即插入或更新)后。

AfterConvertEvent

从数据库创建聚合根目录并设置其所有属性后。ResultSet

生命周期事件依赖于 ,在这种情况下,可以用 配置 ,因此不能保证何时处理事件。ApplicationEventMulticasterSimpleApplicationEventMulticasterTaskExecutor

特定于存储的实体回调

Spring Data JDBC 使用 EntityCallback API 进行审计支持,并对下表中列出的回调做出反应。

表 2.Spring Data JDBC执行的不同进程的处理步骤和回调。
过程 EntityCallback/ 工艺步骤 评论

删除

BeforeDeleteCallback

在实际删除之前。

将从数据库中删除聚合根目录和该聚合的所有实体。

AfterDeleteCallback

删除聚合后。

救

确定是否要执行聚合的插入或更新,具体取决于它是否是新的。

BeforeConvertCallback

如果要以编程方式设置 id,这是正确的回调。在上一步中,检测到了新的聚合,在此步骤中生成的 Id 将在下一步中使用。

将聚合转换为聚合更改,它是要对数据库执行的一系列 SQL 语句。在此步骤中,将决定 Id 是否由聚合提供,或者 Id 仍为空且预期由数据库生成。

BeforeSaveCallback

可能会考虑对聚合根所做的更改,但是否将 id 值发送到数据库的决定已在上一步中做出。 请勿将其用于为新聚合创建 ID。请改用。BeforeConvertCallback

上面确定的 SQL 语句将针对数据库执行。

AfterSaveCallback

保存聚合根目录(即插入或更新)后。

负荷

使用 1 个或多个 SQL 查询加载聚合。从结果集构造聚合。

AfterConvertCallback

我们鼓励在事件上使用回调,因为它们支持使用不可变类,因此比事件更强大、更通用。

表 2.Spring Data JDBC执行的不同进程的处理步骤和回调。
过程 EntityCallback/ 工艺步骤 评论

删除

BeforeDeleteCallback

在实际删除之前。

将从数据库中删除聚合根目录和该聚合的所有实体。

AfterDeleteCallback

删除聚合后。

救

确定是否要执行聚合的插入或更新,具体取决于它是否是新的。

BeforeConvertCallback

如果要以编程方式设置 id,这是正确的回调。在上一步中,检测到了新的聚合,在此步骤中生成的 Id 将在下一步中使用。

将聚合转换为聚合更改,它是要对数据库执行的一系列 SQL 语句。在此步骤中,将决定 Id 是否由聚合提供,或者 Id 仍为空且预期由数据库生成。

BeforeSaveCallback

可能会考虑对聚合根所做的更改,但是否将 id 值发送到数据库的决定已在上一步中做出。 请勿将其用于为新聚合创建 ID。请改用。BeforeConvertCallback

上面确定的 SQL 语句将针对数据库执行。

AfterSaveCallback

保存聚合根目录(即插入或更新)后。

负荷

使用 1 个或多个 SQL 查询加载聚合。从结果集构造聚合。

AfterConvertCallback