使用JPQL时Hibernate Envers是否失效?删除操作无法被检测?
Hibernate Envers与JPQL相关问题解答
问题1:使用JPQL时Envers功能是否无法正常工作?
Envers完全支持JPQL,但有几点需要注意:
- 只要是通过
EntityManager的标准API(比如createQuery())执行JPQL查询或实体级操作,Envers的审计功能都能正常运行。 - 但如果是执行JPQL的批量
UPDATE/DELETE语句,这类操作直接操作数据库,不会触发Hibernate的实体生命周期回调,Envers不会自动生成审计记录。如果需要审计这类批量操作,要么手动调用Envers的API记录变更,要么改用先查询实体再修改/删除的方式。
问题2:使用JPQL语法时,是否无法检测到删除操作?
分两种场景来看:
- 如果是用JPQL查询出实体后,通过
EntityManager.remove()执行删除操作,Envers可以正常检测并生成审计记录。 - 如果是直接执行JPQL批量删除语句(例如
DELETE FROM User u WHERE u.status = 'INACTIVE'),这类操作绕过了实体生命周期流程,Hibernate不会触发删除事件,Envers也就无法自动检测到这类删除。要审计这类操作,需要手动处理变更记录,或者改为逐个删除实体。
内容的提问来源于stack exchange,提问作者ccc
相关产品推荐
相关产品推荐

