如何在hibernate审计中获取版本号

时间:2017-06-02 06:47:29

标签: hibernate-envers

我正在使用Hibenate Envers。实体已成功审核。现在我希望获得版本号(就像REV一样)以获得实体,以便在每次更新时它都会自动更新(就像@Version一样) 我怎么能这样做? 我应该@Version使用@Audited吗? 或者我可以获得rev_id每个实体获得最新版本吗?

请帮忙吗?

1 个答案:

答案 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个元素:

  1. 索引0 - 实体的审核快照。
  2. 索引1 - 修订实体(存储时间戳和修订号的地方)。
  3. 索引2 - 修订类型,ADD / MOD / DEL。
  4. 与先前的Envers方法相比,这种方法的好处在于它的单个查询可以将数据组合在一起,从而更容易循环和处理。

    所以最终它取决于你尝试服务的目的。如果您只想使用ORM在任何时候有效访问它,请使用@Version。如果要将其与审核快照关联,请启用上述属性作为基准。然后是Envers Query API以各种方式获取数据。