簡體   English   中英

Spring Hibernate Envers:捕獲正在修改的實體

[英]Spring Hibernate Envers: Capture entity being modified

是否可以捕獲在 CustomEntityTrackingListener 或 CustomRevisionListener 中修改的實體(書籍)?

我試圖獲取通過 apis /saveBook 或 /update/{id}/{pages} 傳遞的所有信息,而不僅僅是修訂信息。

在 envers 中審計實體時,它會自動為每個實體創建一個 _AUD 表和一個修訂表以連接實體及其 _AUD 表

使用自定義修訂偵聽器我只能獲取有關修訂的信息,但我想訪問正在修改和保存的實體本身。

...
    @PostMapping("/saveBook")
    public Book saveBook(@RequestBody Book book) {
        return repository.save(book);
    }

    @PutMapping("/update/{id}/{pages}")
    public Book updateBook(@PathVariable int id, @PathVariable int pages) {
        Book book = repository.findById(id).get();
        book.setPages(pages);
        return repository.save(book);
    }
...
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
@Audited
public class Book {

    @Id
    @GeneratedValue
    private int id;

    private String name;

    private int pages;
}

@Entity
//@RevisionEntity(ExampleListener.class)
@RevisionEntity(CustomEntityTrackingRevisionListener.class)
public class ExampleRevEntity extends DefaultRevisionEntity {


    private String username;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @OneToMany(mappedBy="revision", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
    private Set<ModifiedEntityTypeEntity> modifiedEntityTypes =
            new HashSet<ModifiedEntityTypeEntity>();

}



public class ExampleListener implements RevisionListener {

    @Override
    public void newRevision(Object revisionEntity) {
        ExampleRevEntity exampleRevEntity = (ExampleRevEntity) revisionEntity;
        //Identity identity = (Identity) Component.getInstance("org.jboss.seam.security.identity");

        exampleRevEntity.setUsername("Joaquin");
    }
}
public class CustomEntityTrackingRevisionListener implements EntityTrackingRevisionListener {
    @Override
    public void entityChanged(Class entityClass, String entityName,
                              Serializable entityId, RevisionType revisionType,
                              Object revisionEntity) {

        String type = entityClass.getName();
        //((CustomTrackingRevisionEntity)revisionEntity).addModifiedEntityType(type);
        ((ExampleRevEntity)revisionEntity).addModifiedEntityType(type);
    }

    @Override
    public void newRevision(Object revisionEntity) {

    }

}

EntityTrackingRevisionListener.entityChanged()在 object 持久性之后執行,因此您可以使用提供的標識符和實體 class 通過EntityManagerfind()方法從持久性上下文中獲取它。

有幾種方法可以實現這一點。

  • 引入你自己的事件監聽器
  • 使用 CDC(更改數據捕獲)技術,例如 Debezium。

在第一種方法中,您可能希望遵循 Envers 文檔中關於如何進行條件審計的建議,並引入擴展 Envers 偵聽器的自定義事件偵聽器,以便推斷更改並執行您需要的任何任務。

這可能是一個非常艱巨和乏味的步驟,因為您必須了解 Hibernate 如何在事件中發出其數據,如何解決差異等。

我相信這里更簡單的方法是使用諸如 Debezium 之類的工具,它使您能夠設置一個監控配置數量表的作業,在您的用例中是感興趣的特定_AUD表。 每次 Envers 插入這些表時,Debezium 都會通過生成一個事件來對插入做出反應,然后您可以對這些事件進行異步反應。

Debezium 有多種使用方式,包括嵌入到可能適合您的用例的應用程序中,或者嵌入與應用程序分離並為事件捕獲和調度提供冗余和容錯的 Kafka Connect 實例中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM