如何实现触发器Spring-Data Repository的保存方法之前/之后

时间:2014-10-26 17:05:45

标签: java spring hibernate spring-data

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

我想要实现这样的记录器:

  • 有一个单独的数据库,用于包含两个表的日志:log& logdata
  • log表:
    • 创建
    • 用户名
  • logdata表:
    • LOG_ID
    • 字段名
    • value(of string)
  • savedelete方法运行时,MyRepositoryTrigger应编写一条日志消息,其中所有字段都已更改为字段名称和字段值。

但是如何写那样的smth?

2 个答案:

答案 0 :(得分:4)

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

如果您希望模仿触发功能,而不需要在CrudRepository#save()/delete()功能之前/之后每次都进行设置,那么您最好使用Spring AOP功能

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

您可以找到extensive Spring AOP programming documentation in the Spring Docs

答案 1 :(得分:1)

您似乎正在尝试为更改实施审核日志。如果您将Spring Data JPA与Hibernate一起使用,我可能会建议您使用Hibernate Envers来解决所有问题。添加maven依赖项,然后在实体(或界面)上添加@Audited注释,envers将为您审核的每个实体创建一个* _aud表,并自动添加更改日志。

存储用户ID有点棘手,但您可以find example here in the documentation for that as well