spring4, hibernate4 整合问题

发布于 2022-01-05 06:28:56 字数 2650 浏览 725 评论 16

在整合spring4,hibernate4的时候,在dao层获取session报错:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread

代码中的写法是:

然后我上网查了好多资料,大多都说要使用getCurrentSession()方法,要在hibernate里配置:

<prop key="hibernate.current_session_context_class">thread</prop>

加上上面的配置之后运行会报这样的错:

org.hibernate.HibernateException: createCriteria is not valid without active transaction

我上网查了很多关于这个错的原因,大多的都说是dao层没有加上事务的原因,都建议在dao层的实现类上也加上@Transaction这个注解,但是我加上之后还是没用,一点效果都没有

问了好几个群,大多都说是因为service里没有配置上事务造成的,可我service类里确实加上了@Service和@Transaction这两个注解了啊。

也有地方说这样配置:

<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
但这样配置之后还是会报没有配置之前的错:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
还有说在web.xml里配置的:

这样配置了之后确实没问题,不过用的是OpenSessionInViewFilter,我不太明白是什么意思?跟getCurrentSession()有什么区别吗?

----------------------------------------分割线----------------------------------------

除了上面的配置,我还试了下面这些配置,均无效,都是报错

让我诧异的一个地方是如果是junit4测试的话,是不会报错的,配置如下:

applicationContext.xml里的事务配置:


service里的配置:

dao里的配置:

junit4测试的时候是没有在dao里配置@Transaction ,也没有在applicationContext.xml里的hibernateProperties里配置hibernate.current_session_context_class属性,但测试就是不报错,控制台也有sql语句输出。

----------------------------------------分割线----------------------------------------

我确实没办法了,希望oschina里的大神来帮忙分析错在哪,能帮忙讲解一下原因,不胜感激。


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

甜柠檬 2022-01-08 04:12:01

不要用声明式事务就好了,我现在用的就没问题了

静谧 2022-01-08 04:12:01

我也和你遇到一样的问题了。。。不知道如何接解决啊~~~

笑红尘 2022-01-08 04:11:56

这条回答有用,我分applicationContext.xml与spring-mvc.xml两个配置,将<tx:annotation-driven transaction-manager="transactionManager" />放在applicationContext.xml里面就报这个错,改放在spring-mvc.xml里面就好了。

北笙凉宸 2022-01-08 04:11:56

楼主现在怎么解决的能贴出来嘛?我也遇到这个问题

谁的新欢旧爱 2022-01-08 04:11:55

<tx:annotation-driven transaction-manager="transactionManager" />

上面这句需要加在DispatcherServlet指定的xml中

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>

加在下面的root xml中,会导致在servlet时调用不到事务管理器

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
  </context-param>

之所以你用junit可以,是因为junit进来不是经过servlet进来所以你配置在root中的事务管理器能找到。但是普通通过servlet进来的请求,找不到root中的事务管理器,所以需要在DispachServlet指定的xml中配置事务管理器供其使用

冷默言语 2022-01-08 04:11:50

我用的是Spring 4 + Hibernate 5 ,和你版本不一样,答不了

眼眸里的那抹悲凉 2022-01-08 04:11:10

OpenSessionView是用来减决Hibernate懒加载问题,如果在程序使用了load/iterator等方法时,程序并不会马上向数据库发出SQL,等你在前台页面获取时,此时session已经早就关闭(因为事务一般都是在service层),会出现错误。如果程序没有使用事务,如果在程序中进行了更新删除操作,那么也是不允许的,因为spring中默认事务是只读事务,这样也会出现错误。可以在DAO设置,HibernateTemplate有一个变量可以查看源码。spring中已经自动支持了getCurrentSession(),请不要在Hibernate配置hibernate.current_session_context_class为“Thread”否则也会出错

海之角 2022-01-08 04:09:54

试试在Dao层注入sessionFactory,比如

@Repository
public class BaseHibernateImpl extends HibernateDaoSupport implements
		IBaseHibernate {

	private SessionFactory sessionFactory;
	
	@Autowired
	public void setSessionFacotry(SessionFactory sessionFacotry) {     
        super.setSessionFactory(sessionFacotry);     
	}
}

终遇你 2022-01-08 04:05:50

不要用声明式事务就好了,我现在用的就没问题了

丢了幸福的猪 2022-01-08 03:47:33

同求答案

草莓味的萝莉 2022-01-08 03:41:26

我也不知道怎么就好了

把回忆走一遍 2022-01-08 03:21:00

现在没有问题了,用aop的配置,不要用声明式的事务,就可以了

如日中天 2022-01-08 03:03:35

AOP 配置是?

葬花如无物 2022-01-08 02:55:18

楼主解决了没有,我也遇到这问题了,同求解决

德意的啸 2022-01-07 07:34:36

我也借用了 ,有点问题,后来重新生成entity,就好了!感谢楼主无私奉献!

把回忆走一遍 2022-01-07 02:01:09

没有大神吗?怎么没一个人留言呢?唉。。。。伤心啊

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文