我正在使用Hibenate Envers。实体审核成功。现在我想拥有版本号(就像REV)来获取实体,以便在每次更新时自动更新(就像@Version) 我该怎么做? 我应该使用@Version
和@Audited
吗? 或者我可以得到rev_id
每个实体获得最新版本?如何在休眠审计中获取版本号
请帮忙吗?
我正在使用Hibenate Envers。实体审核成功。现在我想拥有版本号(就像REV)来获取实体,以便在每次更新时自动更新(就像@Version) 我该怎么做? 我应该使用@Version
和@Audited
吗? 或者我可以得到rev_id
每个实体获得最新版本?如何在休眠审计中获取版本号
请帮忙吗?
答案真的归结为您的用例以及您打算如何获取价值。
如果您想要向ORM实体表发出Criteria,JPQL或HQL查询,并且希望能够获取指示该行被修改频率的数值,则应该使用@Version
注解。这是ORM为乐观锁定而维护其自身的一个值,但它可以用于指示行以某种方式被修改的次数。当然,缺点是当行被删除时,你忽略了这个值。
默认情况下,Envers不会跟踪审计模式中的@Version
带注释的属性。因此,如果Envers在删除数据时存储数据,请注意,除非您特别启用乐观锁定属性的跟踪,否则当ORM行被删除时,您将再次丢失该值。为此,您要将org.hibernate.envers.do_not_audit_optimistic_locking_field
设置为false。最后,如果您想使用Envers Query API并获取您实体的历史表示的快照,那么您可以通过几种方式使用查询API来根据Envers修订版本号语义来确定这一点。
第一种方法是向查询API请求与实体类关联的所有修订的列表,然后在相关版本中获取每个实体快照。不幸的是,这个过程需要你在数据库查询上多做一些工作,所以对于频繁修改的实体,这可能会有一些性能问题。
第二种方法是在Envers Query API上利用forRevisionsOfEntity
方法,并将第二个参数指定为false。这第二个参数有效地控制返回类型的方法将提供,其中该对象数组包含3个元素假将返回的Object[]
数组:
这种方法优于先前的Envers方式的好处是它的单个查询将数据组合在一起,从而更容易进行循环和处理。
所以最终它取决于你试图服务的目的。如果它只是一个你想在任何时候使用ORM有效访问的计数器,请使用@Version
。如果您希望它与审核快照关联,请启用上述属性作为基准。然后Envers Query API以各种方式获取数据。