我如何才能登录实体到日志文件的变化?想想我有这样Person
。
import org.hibernate.envers.Audited;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.Column;
@Entity
@Audited
public class Person {
@Id
@GeneratedValue
private int id;
private String name;
private String surname;
// add getters, setters, constructors, equals and hashCode here
}
和改变现有Person
的代码
Person p1 = new Person("name-1", "surname-1");
personRepository.save(p1);
Person p2 = personRepository.findOne(1L);
p2.setName("new-name");
personRepository.save(p2);
怎样才可以有
在我的日志文件?我知道envars可以存储在数据库的变化,让我与AuditReader
后提取出来,但我喜欢存储在JSON文件的变化将它们发送到第三方应用程序(如弹性)。
你可以写通过实施org.hibernate.EmptyInterceptor
自定义拦截器。这有回调更新/插入/与实体的新老快照删除。
请参阅有关详细信息,this文章
我实际上从两个角度解决这个。
你们中的一个获得通过Envers的好处是可以非常快速地标注您的实体,并告诉框架你到底如何想跟踪你的实体模型变化的事实。什么是更好的是你可以有Envers自动生成diffable领域为您服务。
让我们这个基本的实体:
@Entity
@Audited(withModifiedFlag = true)
public class Person {
@Id
@GeneratedValue
private Integer id;
private String name;
}
当您启用withModifiedFlag
功能,此通知Envers一些额外的元数据列添加到审计表这个实体,所以基本上这个实体的审计表是这样的:
+----+------+----------+-----+---------+
| ID | name | name_MOD | REV | REVTYPE |
+----+------+----------+-----+---------+
这样做的好处是,如果你使用的是过程的出口和直接从表流中的数据,您不再需要差异比较实际对前行知道是什么改变了当前行;该模式告诉你这只是自动通过查看相关_MOD
列1
(真)或0
(假)。
从这一点来说,你有几个选项。
您可以使用Hibernate原生查询,提取和数据转换成JSON对于无论是通过一些后台应用程序的线程或单独的后台进程ES。由于_MOD
柱为您提供的指示器,一个场改变时,可以很容易地读出的行和建立必要的数据,而不必在提取时间进行区分操作。
我也建议配置Envers放置审计对象在一个单独的目录/模式。这最大化数据库的同时提高跨多个数据库磁盘IO能力。
该项目Debezium是处理数据复制一个很好的方式。它的一个很大的好处是,它使用户能够跨越这正好适合到模型异构平台做到这一点。
这里最大的区别是,Debezium不直接读取数据库,以确定变化,而是读取数据库事务日志文件,并会产生一系列事件的描述所发生的针对数据库的DML操作。总之,你避免了读操作你这么在意,因为Debezium直接从事务日志再水合状态。
举个例子:
INSERT INTO Person (?,?) VALUES (?,?)
。INSERT INTO Person_AUD (...) VALUES (....)
Person_AUD
(表订阅)。它是在(5)在您的转换/加载代码将存在于接收插入事件并产生一个JSON输出,并将其发送到ES。
通过使用Debezium,你能够有效地下线复制在一个非常有效的庄园跨异构环境的数据。不仅是这个项目非常适合你的使用情况,但在今天的现代微服务架构在数据共享服务之间是至关重要的世界极其宝贵的。
通过使用Envers,你能能够提供给用户审计的历史数据,当你ES群集不可用或过载,而不是给用户提供了一个在线备用解决方案“服务不可用,稍后回来”的回应。
无论你决定,业绩不是唯一有关的因素。你也应该铭记的用户体验,可扩展性和可靠性也;因此为什么我认为最佳的解决方案是对中的两个。