我正在使用jpa的hib,并且我已经用postgres触发器实现了审计。
在我的源代码中,我在preInsert、preUpdate和preDelete上使用了à listener来创建一个修订版本。只有当保存的实体被custom @AuditedEntity注解时,这个修订版本才会被添加
此修订行包含transactionId,同一事务中的所有修改均通过postgres触发器记录到audit_revision_details中,通过此机制,我可以检索对实体所做的所有修改。
我有一个带有@AuditedEntity注解的用户实体,在用户实体中我有一个RoleUser集。当我更改用户的姓氏时,一切正常,我在audit_revision表中创建了一个修订行,在audit_revision_details中我可以看到更改。
但是当我只在RoleUser中保存元素时(我保存用户,RoleUser保存为CascadeType.ALL),在audit_revision中不会创建修订版本,因为当我在preInsert/preDelete或preUpdate侦听器中输入时,保存的实体是RoleUser,RoleUser没有@AuditedEntity注解,因为拥有此注解的是User。
一个解决方案是在用户实体中添加一个字段,我总是更新,这样,我总是保存用户实体,我有我的修订,但它不是很干净.
另一个是检查实体是否由@AuditedEntity标注或entity_name是否为“RoleUser”,并且我总是创建修订版本...但如果我在更改角色的同时更改姓氏,我可能会在bdd中有2个修订版本,因此我需要检查之前是否存在一个修订版本...
我不想使用hibernate-envers(envers也有同样的问题...)
当我只在另一个版本中更改实体时,我如何告诉hib强制创建修订?
有没有人有实现同样的事情,可以帮助我?
谢谢
1条答案
按热度按时间q7solyqu1#
一个解决方案是在用户实体中添加一个字段,我总是更新,这样,我总是保存用户实体,我有我的修订,但它不是很干净.
我认为这将是您唯一可行的选择,除非您可以使所有的 * 到许多协会拥有,即删除
mappedBy
部分。通过使多方成为拥有方,当集合发生某种变化时,Hibernate会将实体视为脏的,尽管我不认为对集合中实体的更改会导致相同的结果。如果您希望对元素的更改也导致实体被视为脏的,则必须使用
@ElementCollection
。总的来说,在User上引入一个字段(如
modificationTimestamp
)并对其进行更新可能是实现此目的的最简单方法。