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

How to get version Number in hibernate auditing

我正在使用 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 查询 API 并获取实体历史表示的快照,那么您也可以通过多种方式使用查询 API 来确定这一点,基于Envers 修订号语义。

第一种方法是向查询 API 询问与实体 class 关联的所有修订的列表,然后在相关修订中获取每个实体快照。不幸的是,此过程需要您对数据库查询进行两次查询,因此对于经常修改的实体,这可能会带来一些性能问题。

第二种方法是利用 Envers 查询 API 上的 forRevisionsOfEntity 方法并将第二个参数指定为 false。第二个参数有效地控制了该方法将为您提供的 return 类型,其中 false 将 return 一个 Object[] 的数组,其中对象数组包含 3 个元素:

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

与之前的 Envers 方法相比,这种方法的好处在于它是一个单一的查询,return将数据组合在一起,使其更容易循环和处理。

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