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