我尝试了第一个Hibernate Envers实现。我已经获得了所有@Audited标签,并且我正在生成DDL来创建审计表。
根据我读过的内容,每次审计表获得新记录,记录更改或记录被删除时,审计表都会得到记录。
对于我的实施,我只关心变化,因为我已经读到了审计的性能问题,我想关掉我不需要的东西。
我很难找到相关信息。唯一接近的是说我需要关闭所有Envers听众并自己重新实现它们,让我不想做的事情。
这似乎很多工作,而且我已经处于未知领域。有谁知道一个简单的方法来做到这一点?如果不这样做,是否有人可以分享他们可以分享的代码来说明如何做到这一点?
谢谢,
答案 0 :(得分:1)
这里简短的回答是没有。
唯一可用的切换选项是告诉Envers是否应审核DEL
修订版类型行中的所有列数据。删除实体时,默认行为不包括所有列值;但是有些情况下存储这些信息非常有用。
此外,这不仅仅是阻止特定Envers侦听器注册的简单情况,也不像重新编码特定侦听器那么简单。
让我们看看一些用例
// Fetch the parent
Parent parent = entityManager.find( Parent.class, parentId );
// Add a new child entity to parent
entityManager.getTransaction().begin();
Child child = new Child( "Naros" );
child.setParent( parent );
parent.getChildren().add( child );
entityManager.persist( child );
entityManager.merge( parent );
entityManager.getTransaction().commit();
// Update a child entity
entityManager.getTransaction().begin();
child.setName( "Naros2" );
entityManager.merge( child );
entityManager.getTransaction().commit();
// Remove child entities from parent
entityManager.getTransaction().begin();
parent.getChildren().forEach( c -> c.setParent( null ) );
parent.getChildren().clear();
entityManager.merge( parent );
entityManager.getTransaction().commit();
在上述所有3
个案例中,Parent
实体将使用MOD
修订条目进行审核,该条目描述了在特定时间使用给定修订号修改过的ADD
实体。
类似地,第一个场景在Child
被添加到父集合时将包含Parent
修订条目。这将包括与MOD
的第一个修订版相同的修订版号。
第二个方案将包含Child
修改后的MOD
条目。根据父级中集合的类型,您所做的更改是否会影响集合的顺序,也可能会为Parent
实体触发DEL
。
最后一个方案将包含Child
修订后的MOD
条目,该条目从集合中删除,Parent
因为父级的状态已被修改。
是否可以禁用此类行为。但这样做的问题是你失去了一些非常有价值的功能。
例如,Parent
只包含用于实际修改Parent
属性的审核行,而不包含修改与其关联的任何集合属性时的审核行。这意味着在一个简单的例子中,ADD
只有1个审计行,Parent
插入时。
但是,如果您需要在更改子集合后的每个修订步骤中了解cbar.ax.tick_params(labelsize=10)
的实际状态,该怎么办?好吧,你不能。
你还没有详细说明为什么性能在这里真的会成为一个问题,所以我不一定会在具体细节上触及它。
但如果你这样做,那么试图关闭Envers的各个方面可能并且可能会从审计角度产生负面影响。