Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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 MVC和Hibernate的每个请求一个事务_Java_Spring_Hibernate_Open Session In View - Fatal编程技术网

Java 使用Spring MVC和Hibernate的每个请求一个事务

Java 使用Spring MVC和Hibernate的每个请求一个事务,java,spring,hibernate,open-session-in-view,Java,Spring,Hibernate,Open Session In View,我想使用SpringMVC和Hibernate。我不想在所有控制器方法上使用服务层或@Transactional属性(或者,更确切地说,我希望Spring将它们都视为事务性的)。所以我想在控制器方法开始处理数据库时启动事务,并在控制器方法返回ViewAndModel时提交事务,或者在发生任何错误时回滚事务。此外,我希望视图支持惰性hibernate加载,例如,如果html模板请求,则以自动提交模式选择数据 我知道最佳实践包括创建一个具有@Transactional属性的独立服务层,但我的应用程序

我想使用SpringMVC和Hibernate。我不想在所有控制器方法上使用服务层或
@Transactional
属性(或者,更确切地说,我希望Spring将它们都视为事务性的)。所以我想在控制器方法开始处理数据库时启动事务,并在控制器方法返回ViewAndModel时提交事务,或者在发生任何错误时回滚事务。此外,我希望视图支持惰性hibernate加载,例如,如果html模板请求,则以自动提交模式选择数据

我知道最佳实践包括创建一个具有
@Transactional
属性的独立服务层,但我的应用程序不会从额外的复杂性中获益,我希望尽可能简化代码

我了解到,
OpenSessionInViewInterceptor
允许在视图中继续使用hibernate会话,因此这可能解决了我的第二个需求。但是如何使所有控制器方法都是事务性的呢


理想情况下,如果我需要的话,我希望有一个简单的方法来选择退出这种行为。例如,所有方法都是事务性的,但我可以应用@NonTransactional之类的方法,并更精确地管理事务。

实际上
OpenSessionInViewInterceptor
将在任何控制器代码启动之前打开一个会话(隐式地打开一个事务),并在http请求完成之前关闭它。因此,它应该解决您的两个需求


OpenEntityManagerInView也一样

您考虑过使用Spring AOP吗?是的,我不太清楚,但现在正在研究它。我希望有一些简单的解决方案,因为这个任务似乎很典型。