Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Java Spring Hibernate是在会话中处理修改查询的最佳方法_Java_Spring_Hibernate_Session - Fatal编程技术网

Java Spring Hibernate是在会话中处理修改查询的最佳方法

Java Spring Hibernate是在会话中处理修改查询的最佳方法,java,spring,hibernate,session,Java,Spring,Hibernate,Session,问题是: 在会话中,如果必须使用修改查询(如更新),则该更改在会话范围内不可见。使其可见的一种方法是在@modifying注释中将修改查询设置为clearAutomatically=true。问题是,此更改将影响同一会话中的所有更改,即在该调用之前已保存的对象将作废,并且一旦事务关闭,更改的对象将不会持久化 我的问题是:当ClearAutomatic不是一个选项时,处理此问题的最佳方法是什么?根据Hibernate会话刷新模式的不同,您的持久性对象可能会在通过对会话执行flush()操作执行查询

问题是:

在会话中,如果必须使用修改查询(如更新),则该更改在会话范围内不可见。使其可见的一种方法是在@modifying注释中将修改查询设置为clearAutomatically=true。问题是,此更改将影响同一会话中的所有更改,即在该调用之前已保存的对象将作废,并且一旦事务关闭,更改的对象将不会持久化


我的问题是:当ClearAutomatic不是一个选项时,处理此问题的最佳方法是什么?

根据Hibernate会话刷新模式的不同,您的持久性对象可能会在通过对会话执行flush()操作执行查询之前与持久性存储同步。flush进程通过检测状态更改和执行SQL语句来同步数据库状态和会话状态,但它不提交事务

默认刷新模式为自动,如下所述:


有时会在执行查询之前刷新会话,以确保查询永远不会返回过时状态。这是默认的刷新模式。如果在查询中返回陈旧数据,手动刷新会话应该可以解决问题。

那么,您是说如果在运行clearAutomatically=true的查询之前执行刷新,我们不会丢失任何更改?实现这一点的最佳刷新模式是什么?谢谢如果您像主题所建议的那样使用Hibernate,那么您不需要使用@Modifying meta data,它看起来是JPA而不是Hibernate。您只需要保留为AUTO flushmode,但如果您在查询中获取过时数据,请在运行查询之前执行Session.flush(),尽管AUTO将在大多数查询之前刷新。您需要确保您没有修改分离的或暂时的对象。这似乎是有意义的。谢谢我还验证了它只发生在更新中,而不是插入中,但我无法确认它是否相关。我现在要接受它。