如何实现Spring-Data Repository的Before/Aftersave方法的触发器

Mik*_*lov 5 java spring hibernate spring-data

我有很多实体。对于每个实体,我都有一个扩展CrudRepository. 使用*Repository.save(entity)方法保存每个实体。

我想实现一个这样的记录器:

  • 有一个单独的日志数据库,有两个表:log & logdata
  • log 桌子:
    • 创建
    • 用户名
  • logdata 桌子:
    • 日志编号
    • 字段名
    • 值(字符串的)
  • 当save或delete方法运行时,MyRepositoryTrigger 应写入一条日志消息,其中所有字段都更改为字段名称和字段值。

但是这样怎么写呢?

dim*_*sli 6

对于触发器功能,您必须查看数据库,但很可能它不能保证CrudRepository数据库活动的排他性,因为它是在表/列的创建/删除/更新时设置的。

相反,如果您想模仿触发器功能,意味着要触发某些东西,而不必每次在功能之前/之后都进行设置,CrudRepository#save()/delete()那么您最好使用Spring AOP功能

@After("execution(* my.CrudRepository.save(..))")
public void log(JoinPoint point) {
    log.info(point.getSignature().getName() + " was called..");
}
Run Code Online (Sandbox Code Playgroud)

您可以在 Spring Docs 中找到大量 Spring AOP 编程文档