如何向我的所有实体添加ChangeHistory

问题描述

我有一个微服务,该微服务具有一个小的实体结构和一个用于我的客户端的REST接口。

我想要的是:我想跟踪实体中特定原始属性的所有更改。

例如,我有一个实体书,其中有很多页。

现在,客户将书名更改为某些页面的颜色,并将更新请求发送到服务器。

我想(在同一事务中)将这些更改保存到数据库中,是为每个已更改的原始属性在“ book_changes”和“ page_changes”表中添加一行。诸如“ 用户X将属性Y从值R更改为值U ”的行

  1. 是否有一种方法可以通用/自动找出当我必须使用相同类的实体时哪些原始属性发生了变化?也许是泛型?

  2. 如何指定应该监视哪些属性?是否可以选择自己的注释“ @MonitorChange”,还是在运行时无法访问注释?

  3. 如何确保使用Spring Data JPA在一次事务中发生这种情况?我是否只需要将@Transactional注释添加到我的服务类或方法中?

    @Service
    @Transactional
    public class BookService {
        
        @Transactional
        public Book updateBookWithPages(Book book){
            saveEntity(book)
            saveChangestochangesTable(book.computeChanges())
       }
    }

感谢您的帮助

解决方法

Hibernate Envers是实现此目的的合理工具。您只需将实体或属性注释为@Audited(并为其创建审计表),然后进行处理以拦截器。