2017-06-02 69 views
0

我正在使用Hibenate Envers。实体审核成功。现在我想拥有版本号(就像REV)来获取实体,以便在每次更新时自动更新(就像@Version) 我该怎么做? 我应该使用@Version@Audited吗? 或者我可以得到rev_id每个实体获得最新版本?如何在休眠审计中获取版本号

请帮忙吗?

回答

0

答案真的归结为您的用例以及您打算如何获取价值。

如果您想要向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[]数组:

  1. 索引0 - 实体的审计快照。
  2. 索引1 - 修订实体(存储时间戳和修订号)。
  3. 索引2 - 修订类型ADD/MOD/DEL。

这种方法优于先前的Envers方式的好处是它的单个查询将数据组合在一起,从而更容易进行循环和处理。

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