Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠环境删除模式_Hibernate_Spring Mvc_Hibernate Envers - Fatal编程技术网

Hibernate 休眠环境删除模式

Hibernate 休眠环境删除模式,hibernate,spring-mvc,hibernate-envers,Hibernate,Spring Mvc,Hibernate Envers,我使用HibernateEnvers4.1.8.Final 我的环境配置: org.hibernate.envers.store_data_at_delete=true 我希望在删除基表中的记录时, 新记录将插入具有相同列和相同数据的表中。 但是没有!除revtype和rev外,未插入表aud offcource中的数据 换句话说,上述配置无法正常工作! 有人能帮我吗?根据您的评论,问题在于您使用HQL来删除实体引用,而不是使用EntityManager/Session上指定的两种删除方法:

我使用HibernateEnvers4.1.8.Final

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

我希望在删除基表中的记录时, 新记录将插入具有相同列和相同数据的表中。 但是没有!除revtype和rev外,未插入表aud offcource中的数据

换句话说,上述配置无法正常工作!
有人能帮我吗?

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

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

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

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

考虑一下您正在尝试的用例。假设您的实体尚未从数据库加载,您只需从实体中调用
DELETE,其中id=:id
。在这种情况下没有加载实体状态,因此,如果要触发事件,唯一已知的相关信息是:

  • 实体类型
  • 某些名为
    id
    的属性具有
    :id
    指定的给定值
在这种情况下,属性可能是主键,但这可能是该实体类上的任意随机属性,因此如果不首先使用实体状态初始化持久性上下文,实际上没有有效的方法来审核这样的用例。这将是一个浪费的操作,特别是对于
DELETE
操作,如果该操作是针对大量行的话


希望这能让您了解为什么会看到您所做的事情。

您能介绍一下如何将此属性传递到Hibernate吗?它是来自hibernate.properties文件还是通过一些spring配置?在appContext-hibernate.xml中:如果使用属性配置在类路径的根目录中创建hibernate.properties文件并重试,则为true。您的方案是否可行?是的,我在类路径的根目录中创建了它,但它不起作用!如何删除数据?