如何在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 个元素:
- 索引 0 - 实体的审计快照。
- 索引 1 - 修订实体(存储时间戳和修订号的位置)。
- 索引 2 - 修订类型,ADD / MOD / DEL.
与之前的 Envers 方法相比,这种方法的好处在于它是一个单一的查询,return将数据组合在一起,使其更容易循环和处理。
所以最后这真的取决于你想要服务的目的。如果它只是一个您希望使用 ORM 在任何时候有效访问的计数器,请使用 @Version
。如果您希望它与审计快照相关联,请启用上述 属性 作为基线。然后是 Envers Query API 以各种方式获取数据。
我正在使用 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 个元素:
- 索引 0 - 实体的审计快照。
- 索引 1 - 修订实体(存储时间戳和修订号的位置)。
- 索引 2 - 修订类型,ADD / MOD / DEL.
与之前的 Envers 方法相比,这种方法的好处在于它是一个单一的查询,return将数据组合在一起,使其更容易循环和处理。
所以最后这真的取决于你想要服务的目的。如果它只是一个您希望使用 ORM 在任何时候有效访问的计数器,请使用 @Version
。如果您希望它与审计快照相关联,请启用上述 属性 作为基线。然后是 Envers Query API 以各种方式获取数据。