spring - Debezium 解决方案是什么来显示谁以及何时删除记录日志?

标签 spring hibernate audit cd debezium

我有 spring boot + hibernate 应用程序,现在我想使用 debezium 来捕获日期更改。 假设这个类是我的 POJO 实体类之一:

@Entity
@Table(name = "app_user")
public class User {
    @Id @GeneratedValue
    @Column(name = "id")
    private long id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String firstName;

    // getters and setters are omitted for brevity
}

@Entity
@Table(name = "app_article")
public class Article {
    @Id @GeneratedValue
    @Column(name = "id")
    private long id;

    @Column(name = "title")
    private String title;

    @Column(name = "category")
    private String category;

    @ManyToOne
    @JoinColumn(name = "created_by")
    private User createdBy;

    @ManyToOne
    @JoinColumn(name = "updated_by")
    private User updatedBy;

    @Column(name = "created_date")
    private Date createdDate;

    @Column(name = "updated_date")
    private Date updatedDate;

    // getters and setters are omitted for brevity
}

现在,如果我创建新的 Article 对象并使用如下代码保留它:

Article article = new Article();

article.setId(1);
article.setTitle("Introduction to Debezium");
article.setCategory("auditing");
article.setCreatedBy(Utils.getCurrentUser());
article.setUpdatedBy(Utils.getCurrentUser());
article.setCreatedDate(new Date());
article.setUpdatedDate(new Date());

entityManager.persist(article);

然后再次加载它并更改一些字段并保留它:

Article art = entityManager.load(Article.class, 1);

art.setTitle("Introduction to Debezium for beginners");
art.setCategory("auditing and cdc");
art.setCreatedBy(Utils.getCurrentUser());
art.setUpdatedBy(Utils.getCurrentUser());
art.setCreatedDate(new Date());
art.setUpdatedDate(new Date());

entityManager.persist(art);

然后删除它:

entityManager.delete(Article.class, 1);

我可能会在每个步骤中看到这样的日志:

// create
{
    "payload" : {
        "before" : null,
        "after" : {
            "id" : 1,
            "title" : "Introduction to Debezium",
            "category" : "auditing",
            "created_by" : 1,
            "updated_by" : 1,
            "created_date" : "11/29/2017",
            "updated_date" : "11/29/2017"
        },
        "source" : {
            "name" : "dbserver1",
            "server_id" : 223344,
            "ts_sec" : 1500369632,
            "gtid" : null,
            "file" : "mysql-bin.000003",
            "pos" : 364,
            "row" : 0,
            "snapshot" : null,
            "thread" : 13,
            "db" : "app",
            "table" : "app_article"
        },
        "op" : "c",
        "ts_ms" : 1500369632095
    }
}

// update
{
    "payload" : {
        "before" : {
            "id" : 1,
            "title" : "Introduction to Debezium",
            "category" : "auditing",
            "created_by" : 1,
            "updated_by" : 1,
            "created_date" : "11/29/2017",
            "updated_date" : "11/29/2017"
        }
        "after" : {
            "id" : 1,
            "title" : "Introduction to Debezium for beginners",
            "category" : "auditing and cdc",
            "created_by" : 1,
            "updated_by" : 1,
            "created_date" : "11/29/2017",
            "updated_date" : "11/29/2017"
        },
        "source" : {
            "name" : "dbserver1",
            "server_id" : 223344,
            "ts_sec" : 1500369632,
            "gtid" : null,
            "file" : "mysql-bin.000003",
            "pos" : 364,
            "row" : 0,
            "snapshot" : null,
            "thread" : 13,
            "db" : "app",
            "table" : "app_article"
        },
        "op" : "u",
        "ts_ms" : 1500369632095
    }
}

// delete
{
    "payload" : {
        "before" : {
            "id" : 1,
            "title" : "Introduction to Debezium for beginners",
            "category" : "auditing and cdc",
            "created_by" : 1,
            "updated_by" : 1,
            "created_date" : "11/29/2017",
            "updated_date" : "11/29/2017"
        },
        "after": null,
        "source" : {
            "name" : "dbserver1",
            "server_id" : 223344,
            "ts_sec" : 1500369632,
            "gtid" : null,
            "file" : "mysql-bin.000003",
            "pos" : 364,
            "row" : 0,
            "snapshot" : null,
            "thread" : 13,
            "db" : "app",
            "table" : "app_article"
        },
        "op" : "d",
        "ts_ms" : 1500369632095
    }
}

正如您在上面看到的,我无法检测如何从数据库中删除记录。我怎么解决这个问题?我应该使用像 Hibernate Enver 这样的东西吗 来补充一下吗?

最佳答案

您可以使用逻辑删除,这实际上不会从表中删除Article记录,而只是设置一个deleted标志。这样,用户将成为传输的更新事件的一部分。

然后,您可以实现某种(异步运行)内务处理,以物理方式删除记录。执行此删除的(技术)用户不会对所产生的删除事件有太大兴趣。

关于spring - Debezium 解决方案是什么来显示谁以及何时删除记录日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47552834/

相关文章:

java - Springdoc 指定安全性为开放

java - 我需要担心与 tomcat spring bean 的并发性吗?

Spring @Cacheable 正在破坏 @RequestMapping

java - 错误 : org. hibernate.hql.internal.ast.ErrorCounter - 第 1:45 行:意外标记:从表中获取最后一条记录时的 DESC

oracle - 有没有办法找到某个值何时被插入到 Oracle 数据库上的特定单元格中?

spring - Tomcat主机配置server.xml

Hibernate 条件按外键过滤

java - 如何查找按日期排序的 List<Object>

typescript - 在CQRS/ES系统中记录发行服务和用户的事件

Java Spring 应用程序数据库触发审计 - 如何提供做出更改的正确用户