对于最新的稳定版本,请使用 Spring Data Cassandra 4.3.1! |
对于最新的稳定版本,请使用 Spring Data Cassandra 4.3.1! |
Cassandra 映射框架具有多个内置事件,应用程序可以通过在 .
基于 Spring 的应用程序上下文事件基础结构允许其他产品(如 Spring Integration)轻松接收这些事件,因为它们是基于 Spring 的应用程序中众所周知的事件机制。org.springframework.context.ApplicationEvent
ApplicationContext
若要在对象进入数据库之前截获该对象,可以注册该子类,该子类将覆盖该方法。
调度事件时,将调用侦听器并传递域对象(Java 实体)。
实体生命周期事件可能代价高昂,在加载大型结果集时,您可能会注意到性能配置文件发生了变化。
您可以在模板 API 上禁用生命周期事件。
下面的示例使用以下方法:org.springframework.data.cassandra.core.mapping.event.AbstractCassandraEventListener
onBeforeSave(…)
onBeforeSave
class BeforeSaveListener extends AbstractCassandraEventListener<Person> {
@Override
public void onBeforeSave(BeforeSaveEvent<Person> event) {
// … change values, delete them, whatever …
}
}
在 Spring 中声明这些 Bean 将导致每当调度事件时调用它们。ApplicationContext
具有以下回调方法:AbstractCassandraEventListener
-
onBeforeSave
:在数据库中插入或更新行之前调用和操作,但在创建 .CassandraTemplate.insert(…)
.update(…)
Statement
-
onAfterSave
:在数据库中插入或更新行后调用和操作。CassandraTemplate…insert(…)
.update(…)
-
onBeforeDelete
:在从数据库中删除行之前调用操作。CassandraTemplate.delete(…)
-
onAfterDelete
:从数据库中删除行后调用的操作。CassandraTemplate.delete(…)
-
onAfterLoad
:在从数据库中检索每一行后调用 、 和 方法。CassandraTemplate.select(…)
.slice(…)
.stream(…)
-
onAfterConvert
:在将从数据库检索到的行转换为 POJO 后调用 、 和 方法。CassandraTemplate.select(…)
.slice(…)
.stream(…)
仅针对根级类型发出生命周期事件。 用作聚合根中的属性的复杂类型不受事件发布的影响。 |
仅针对根级类型发出生命周期事件。 用作聚合根中的属性的复杂类型不受事件发布的影响。 |
实体回调
Spring Data 基础结构提供了用于在调用某些方法之前和之后修改实体的钩子。
这些所谓的实例提供了一种方便的方法来检查和修改回调样式的实体。
一个看起来很像一个专门的.
某些Spring Data模块发布允许修改给定实体的存储特定事件(例如)。在某些情况下,例如在使用不可变类型时,这些事件可能会导致麻烦。
此外,事件发布依赖于 .如果使用异步配置它,可能会导致不可预测的结果,因为事件处理可以分叉到 Thread 上。EntityCallback
EntityCallback
ApplicationListener
BeforeSaveEvent
ApplicationEventMulticaster
TaskExecutor
实体回调提供具有同步和反应式 API 的集成点,以保证在处理链中定义明确的检查点按顺序执行,返回可能被修改的实体或反应式包装器类型。
实体回调通常按 API 类型分隔。这种分离意味着同步 API 仅考虑同步实体回调,而反应式实现仅考虑反应式实体回调。
Entity Callback API 已在 Spring Data Commons 2.2 中引入。这是应用实体修改的推荐方法。
在调用可能注册的实例之前,仍会发布特定于现有存储的实例。 |
实现实体回调
An 通过其泛型类型参数与其域类型直接关联。
每个Spring Data模块通常都附带一组涵盖实体生命周期的预定义接口。EntityCallback
EntityCallback
EntityCallback
@FunctionalInterface
public interface BeforeSaveCallback<T> extends EntityCallback<T> {
/**
* Entity callback method invoked before a domain object is saved.
* Can return either the same or a modified instance.
*
* @return the domain object to be persisted.
*/
(1)
T onBeforeSave(T entity, (2)
String collection); (3)
}
1 | BeforeSaveCallback 在保存实体之前要调用的特定方法。返回可能修改的实例。 |
2 | 实体在持久化之前。 |
3 | 许多特定于存储的参数,例如实体所保留到的集合。 |
EntityCallback
@FunctionalInterface
public interface ReactiveBeforeSaveCallback<T> extends EntityCallback<T> {
/**
* Entity callback method invoked on subscription, before a domain object is saved.
* The returned Publisher can emit either the same or a modified instance.
*
* @return Publisher emitting the domain object to be persisted.
*/
(1)
Publisher<T> onBeforeSave(T entity, (2)
String collection); (3)
}
1 | BeforeSaveCallback 在保存实体之前,要在订阅时调用的特定方法。发出可能被修改的实例。 |
2 | 实体在持久化之前。 |
3 | 许多特定于存储的参数,例如实体所保留到的集合。 |
可选的实体回调参数由实现 Spring Data 模块定义,并从 的调用站点推断出来。EntityCallback.callback() |
实现适合您的应用程序需求的接口,如以下示例所示:
BeforeSaveCallback
class DefaultingEntityCallback implements BeforeSaveCallback<Person>, Ordered { (2)
@Override
public Object onBeforeSave(Person entity, String collection) { (1)
if(collection == "user") {
return // ...
}
return // ...
}
@Override
public int getOrder() {
return 100; (2)
}
}
1 | 根据您的要求实现回调。 |
2 | 如果同一域类型存在多个实体回调,则可能会对实体回调进行排序。排序遵循最低优先级。 |
注册实体回调
EntityCallback
如果 Bean 在 .
大多数模板 API 已经实现,因此可以访问ApplicationContext
ApplicationContextAware
ApplicationContext
以下示例说明了有效实体回调注册的集合:
EntityCallback
@Order(1) (1)
@Component
class First implements BeforeSaveCallback<Person> {
@Override
public Person onBeforeSave(Person person) {
return // ...
}
}
@Component
class DefaultingEntityCallback implements BeforeSaveCallback<Person>,
Ordered { (2)
@Override
public Object onBeforeSave(Person entity, String collection) {
// ...
}
@Override
public int getOrder() {
return 100; (2)
}
}
@Configuration
public class EntityCallbackConfiguration {
@Bean
BeforeSaveCallback<Person> unorderedLambdaReceiverCallback() { (3)
return (BeforeSaveCallback<Person>) it -> // ...
}
}
@Component
class UserCallbacks implements BeforeConvertCallback<User>,
BeforeSaveCallback<User> { (4)
@Override
public Person onBeforeConvert(User user) {
return // ...
}
@Override
public Person onBeforeSave(User user) {
return // ...
}
}
1 | BeforeSaveCallback 从注释中接收其顺序。@Order |
2 | BeforeSaveCallback 通过接口实现接收其订单。Ordered |
3 | BeforeSaveCallback 使用 lambda 表达式。默认情况下无序,最后调用。请注意,由 lambda 表达式实现的回调不会公开类型信息,因此使用不可分配的实体调用这些信息会影响回调吞吐量。使用 or 为回调 Bean 启用类型筛选。class enum |
4 | 将多个实体回调接口组合到单个实现类中。 |
特定于存储的实体回调
Spring Data for Apache Cassandra 使用 API 进行审计支持,并对以下回调做出反应。EntityCallback
回调 | 方法 | 描述 | 次序 |
---|---|---|---|
|
|
在将域对象转换为 .
可以更新域对象以包含 . |
|
|
|
标记已创建或修改的可审核实体 |
100 |
|
|
在保存域对象之前调用。 |
|
Entity Callback API 已在 Spring Data Commons 2.2 中引入。这是应用实体修改的推荐方法。
在调用可能注册的实例之前,仍会发布特定于现有存储的实例。 |
1 | BeforeSaveCallback 在保存实体之前要调用的特定方法。返回可能修改的实例。 |
2 | 实体在持久化之前。 |
3 | 许多特定于存储的参数,例如实体所保留到的集合。 |
1 | BeforeSaveCallback 在保存实体之前,要在订阅时调用的特定方法。发出可能被修改的实例。 |
2 | 实体在持久化之前。 |
3 | 许多特定于存储的参数,例如实体所保留到的集合。 |
可选的实体回调参数由实现 Spring Data 模块定义,并从 的调用站点推断出来。EntityCallback.callback() |
1 | 根据您的要求实现回调。 |
2 | 如果同一域类型存在多个实体回调,则可能会对实体回调进行排序。排序遵循最低优先级。 |
1 | BeforeSaveCallback 从注释中接收其顺序。@Order |
2 | BeforeSaveCallback 通过接口实现接收其订单。Ordered |
3 | BeforeSaveCallback 使用 lambda 表达式。默认情况下无序,最后调用。请注意,由 lambda 表达式实现的回调不会公开类型信息,因此使用不可分配的实体调用这些信息会影响回调吞吐量。使用 or 为回调 Bean 启用类型筛选。class enum |
4 | 将多个实体回调接口组合到单个实现类中。 |
回调 | 方法 | 描述 | 次序 |
---|---|---|---|
|
|
在将域对象转换为 .
可以更新域对象以包含 . |
|
|
|
标记已创建或修改的可审核实体 |
100 |
|
|
在保存域对象之前调用。 |
|