此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Relational 3.4.0! |
生命周期事件
Spring Data JDBC 将生命周期事件发布到对象,通常是应用程序上下文中的 bean。
事件是有关特定生命周期阶段的通知。
与实体回调相比,事件用于通知。
事务侦听器将在事务完成时接收事件。
事件和回调仅针对聚合根触发。
如果要处理非根实体,则需要通过包含聚合根的侦听器来实现。ApplicationListener
实体生命周期事件的成本可能很高,在加载大型结果集时,您可能会注意到性能配置文件发生了变化。 您可以在 Template 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:1 映射到事件的可用回调的描述。
事件 | 发布时间 |
---|---|
在删除聚合根之前。 |
|
在删除聚合根之后。 |
|
在将聚合根转换为执行 SQL 语句的计划之前,但在决定聚合是否为新聚合之后,即是否按顺序进行更新或插入。 |
|
在保存聚合根之前(即,插入或更新,但在决定是插入还是更新之后)。 |
|
保存聚合根(即插入或更新)之后。 |
|
从数据库创建聚合根并设置其所有属性后。 |
生命周期事件依赖于 ,在这种情况下,可以使用 配置,因此无法保证何时处理 Event。ApplicationEventMulticaster SimpleApplicationEventMulticaster TaskExecutor |
特定于 Store 的 EntityCallbacks
Spring Data JDBC 使用 EntityCallback
API 来支持其审计,并对下表中列出的回调做出反应。
过程 | EntityCallback / 工艺步骤 |
评论 |
---|---|---|
删除 |
在实际删除之前。 |
|
聚合根和该聚合的所有实体将从数据库中删除。 |
||
删除聚合后。 |
||
救 |
确定是否要执行聚合的插入或更新,具体取决于它是否是新的。 |
|
如果您想以编程方式设置 id,这是正确的回调。在上一步中,检测到了新的聚合,并且在下一步中将使用在此步骤中生成的 ID。 |
||
将聚合转换为聚合更改,它是要对数据库执行的一系列 SQL 语句。在此步骤中,将决定 Id 是否由聚合提供,或者 Id 是否仍为空并且预期由数据库生成。 |
||
可能会考虑对聚合根所做的更改,但是否将 id 值发送到数据库的决定已在上一步中做出。
请勿使用此 ID 为新聚合创建 ID。请改用。 |
||
上面确定的 SQL 语句将针对数据库执行。 |
||
保存聚合根(即插入或更新)之后。 |
||
负荷 |
使用 1 个或多个 SQL 查询加载聚合。从 resultset 构造聚合。 |
|
我们鼓励对事件使用回调,因为它们支持使用不可变类,因此比事件更强大、更通用。