【问题标题】:Hibernate Envers delete modeHibernate Envers 删除模式
【发布时间】:2017-05-14 09:48:09
【问题描述】:

我使用 hibernate-envers 4.1.8.Final

我的环境配置: org.hibernate.envers.store_data_at_delete=true

我希望当我删除基表中的记录时, 新记录将插入 table_aud 具有相同的列和相同的数据。 但不是!除了 revtype 和 rev 之外,table_aud 中没有插入的数据

换句话说,上面的配置不能正常工作! 谁能帮帮我?

【问题讨论】:

  • 您能否介绍一下您是如何将此属性传递给 Hibernate 的?它是来自 hibernate.properties 文件还是通过一些弹簧配置?
  • 在 appContext-hibernate.xml 中:true跨度>
  • 如果您使用属性配置在类路径的根目录中创建一个 hibernate.properties 文件并重试您的方案,它是否有效?
  • 是的,我在类路径的根目录中创建它,但它不起作用!
  • 你是如何删除数据的?

标签: hibernate spring-mvc hibernate-envers


【解决方案1】:

根据您的 cmets,问题在于您使用 HQL 来删除实体引用,而不是使用 EntityManager / Session 上指定的两种删除方法:

  • session.delete(Object)
  • entityManager.remove(Object)

使用 JPQL 或 HQL 语句时,Hibernate 不会引发特定事件,因此不会通知侦听这些事件的集成。在这种情况下,不会引发 post-delete 事件,因此您永远不会看到为 RevisionType.DEL 条目添加了 REVTYPE 行。

使用上述两种方法中的任何一种都可以解决您的问题。

这里的驱动因素是 HQL / JPQL 语句可以像 JPA 的意图那样充当批量操作 CriteriaDeleteCriteriaUpdate。这些旨在潜在地将 DML 操作批量应用于数据库对象,而持久性提供者不必将实体状态加载到持久性上下文中。

想想您正在尝试的用例。想象一下,您的实体尚未从数据库中加载,而您只是调用DELETE FROM YourEntity WHERE id = :id。在这种情况下没有加载实体状态,所以如果要触发事件,唯一已知的相关信息是:

  • 实体类型
  • 一些名为id 的属性具有:id 指定的给定值。

在这种情况下,属性可能是主键,但这很容易是该实体类上的任何随机属性,因此如果不使用实体状态初始化持久性上下文,实际上没有有效的方法来审核这样的用例第一的。这将是一个浪费的操作,特别是对于 DELETE 操作,如果该操作将针对大量行。

希望能提供一些关于为什么你看到你在做什么的见解。

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2020-01-26
    • 2014-07-02
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多