当前位置: 首页 > 知识库问答 >
问题:

SpringHibernate恩维尔斯:正在修改的捕获实体

凌俊名
2023-03-14

是否可以在CustomEntityTrackingListener或CustomRevsionListener中捕获正在修改的实体(Book)?

我试图获取通过API/save book或/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) {

    }

}

共有2个答案

凌黎明
2023-03-14

有几种方法可以做到这一点。

  • 介绍自己的活动听众
  • 使用像Debezium这样的CDC(更改数据捕获)技术。

在第一种方法中,您可能希望遵循Envers留档中关于如何进行条件审核的建议,并引入自定义事件侦听器来扩展Envers侦听器,以便推断更改并执行您需要的任何任务。

这可能是一个非常令人生畏和乏味的步骤,因为您必须了解Hibernate如何在事件中发出数据,如何解决差异等。

我相信这里更简单的方法是使用像Debezium这样的工具,它使您能够设置一个监视配置数量的表的作业,在您的用例中,特定_AUD感兴趣的表。每次 Envers 插入到这些表中时,Debezium 都会通过生成一个事件来对插入做出反应,然后您可以异步地对该事件做出反应。

Debezium有几种使用方式,包括嵌入到可能适合您的用例的应用程序中,或者嵌入到独立于应用程序的Kafka Connect实例中,为事件捕获和调度提供冗余和容错。

亢奇
2023-03-14

EntityTrackingRevisionListener.entityChanged()在对象持久性之后执行,因此您可以使用提供的标识符和实体类,通过EntityManagerfind()方法从持久性上下文中获取它。

 类似资料:
  • 我肯定遗漏了一些显而易见的东西;然而,我正在努力寻找一个答案来解决我与Hibernate Envers之间的问题。 假设我有一个名为MyObject的实体类,它是使用envers审计的。 如果我得到MyObject实例的当前副本,执行以下操作: 我得到了相同实例的历史副本(来自修订版2): 有没有办法区分myobject1和myobject2?我怎么知道myobject1是当前副本,myobjec

  • 我正在实现一个 JPA-EJB 解决方案,该解决方案使用Hibernate-恩维尔斯来审核更改。使用玛丽亚DB 5.5.49. 我有一个表,它有一个< code>auto_increment字段(这不是PK,只是另一个字段),我是这样定义的: 我还按照mysql的要求为这个字段创建了一个索引和一个惟一的约束。 不知何故,Envers 无法识别此字段,并且不会在试镜表中存储 caseNumber 的

  • 可以在一个集合/json? 使用者- 用户:id | name post:id |用户| id |文本 postimage: id|post_id|imgpath 用户模型: 帖子模式: 从用户处获取所有帖子工作正常: 我能够在一个循环内从帖子中获取所有图像 我想要的是得到所有的帖子,没有循环的图像,例如 谢啦

  • 我在我的mod中创建了一个维度,一个当右键点击时应该将你传送到所述维度的物品,但是当我右键点击该物品时我崩溃了。代码中没有错误,我也不清楚是什么造成了日志中的问题。我使用内置的平面块提供程序生成维度。我可以提供你需要的任何文件。很抱歉有任何奇怪的格式设置,我不太习惯。 日志: 世界提供程序: 块提供程序: 传送器项目:

  • 我试图用axios从VueJS到Laravel,这是我的API。 我得到了这个错误:

  • Grok 是 Logstash 最重要的插件。你可以在 grok 里预定义好命名正则表达式,在稍后(grok参数或者其他正则表达式里)引用它。 正则表达式语法 运维工程师多多少少都会一点正则。你可以在 grok 里写标准的正则,像下面这样: \s+(?<request_time>\d+(?:\.\d+)?)\s+ 小贴士:这个正则表达式写法对于 Perl 或者 Ruby 程序员应该很熟悉了,Py