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

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

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

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

	return event -> {

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

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

class PersonLoadListener extends AbstractRelationalEventListener<Person> {

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

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

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

BeforeDeleteEventSpring中文文档

在删除聚合根之前。Spring中文文档

AfterDeleteEventSpring中文文档

删除聚合根目录后。Spring中文文档

BeforeConvertEventSpring中文文档

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

BeforeSaveEventSpring中文文档

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

AfterSaveEventSpring中文文档

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

AfterConvertEventSpring中文文档

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

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

BeforeDeleteEventSpring中文文档

在删除聚合根之前。Spring中文文档

AfterDeleteEventSpring中文文档

删除聚合根目录后。Spring中文文档

BeforeConvertEventSpring中文文档

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

BeforeSaveEventSpring中文文档

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

AfterSaveEventSpring中文文档

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

AfterConvertEventSpring中文文档

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

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

特定于存储的实体回调

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

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

删除Spring中文文档

BeforeDeleteCallbackSpring中文文档

在实际删除之前。Spring中文文档

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

AfterDeleteCallbackSpring中文文档

删除聚合后。Spring中文文档

Spring中文文档

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

BeforeConvertCallbackSpring中文文档

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

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

BeforeSaveCallbackSpring中文文档

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

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

AfterSaveCallbackSpring中文文档

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

负荷Spring中文文档

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

AfterConvertCallbackSpring中文文档

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

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

删除Spring中文文档

BeforeDeleteCallbackSpring中文文档

在实际删除之前。Spring中文文档

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

AfterDeleteCallbackSpring中文文档

删除聚合后。Spring中文文档

Spring中文文档

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

BeforeConvertCallbackSpring中文文档

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

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

BeforeSaveCallbackSpring中文文档

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

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

AfterSaveCallbackSpring中文文档

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

负荷Spring中文文档

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

AfterConvertCallbackSpring中文文档