spring4, hibernate4 整合问题?报错-问答-阿里云开发者社区-阿里云

开发者社区> 爱吃鱼的程序员> 正文

spring4, hibernate4 整合问题?报错

2020-06-14 18:24:00 131 1

在整合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里的大神来帮忙分析错在哪,能帮忙讲解一下原因,不胜感激。


取消 提交回答
全部回答(1)
  • 爱吃鱼的程序员
    2020-06-14 18:24:16

    没有大神吗?怎么没一个人留言呢?唉。。。。伤心啊我也借用了,有点问题,后来重新生成entity,就好了!感谢楼主无私奉献!楼主解决了没有,我也遇到这问题了,同求解决AOP配置是?现在没有问题了,用aop的配置,不要用声明式的事务,就可以了我也不知道怎么就好了同求答案不要用声明式事务就好了,我现在用的就没问题了试试在Dao层注入sessionFactory,比如<preclass="brush:java;toolbar:true;auto-links:false;">@RepositorypublicclassBaseHibernateImplextendsHibernateDaoSupportimplementsIBaseHibernate{privateSessionFactorysessionFactory;@AutowiredpublicvoidsetSessionFacotry(SessionFactorysessionFacotry){super.setSessionFactory(sessionFacotry);}}



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

    用currentsession就不要在配置文件里配置thread了


    而且现在事务都用注解了,只要配置好包扫描然后加上@Transactional就可以了,配置如下
    <beanid="txManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <propertyname="sessionFactory"ref="sessionFactory"/>
      </bean>
    <spanstyle="font-size:13.3333330154419px;"><tx:annotation-driventransaction-manager="txManager"/>

    mybatis事务配置:

    <spanstyle="background-color:#efefef;"><<spanstyle="color:#000080;background-color:#efefef;font-weight:bold;">bean<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">class<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="org.springframework.jdbc.datasource.DataSourceTransactionManager"<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">id<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="transactionManager"<spanstyle="background-color:#efefef;">><spanstyle="background-color:#efefef;"><<spanstyle="color:#000080;background-color:#efefef;font-weight:bold;">property<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">name<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="dataSource"<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">ref<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="dataSource"<spanstyle="background-color:#efefef;">/><spanstyle="background-color:#efefef;"></<spanstyle="color:#000080;background-color:#efefef;font-weight:bold;">bean<spanstyle="background-color:#efefef;">>
    <spanstyle="background-color:#efefef;"><<spanstyle="color:#660e7a;background-color:#efefef;font-weight:bold;">tx<spanstyle="color:#000080;background-color:#efefef;font-weight:bold;">:annotation-driven<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">transaction-manager<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="transactionManager"<spanstyle="background-color:#efefef;">/>

    <spanstyle="background-color:#efefef;">需要导入spring-orm(依赖spring-jdbc)包

    我用的是Spring4+Hibernate5,和你版本不一样,答不了<imgsrc="http://www.oschina.net/js/ke/plugins/emoticons/images/0.gif"alt="">

    <tx:annotation-driventransaction-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中配置事务管理器供其使用

    这条回答有用,我分applicationContext.xml与spring-mvc.xml两个配置,将<tx:annotation-driventransaction-manager="transactionManager"/>放在applicationContext.xml里面就报这个错,改放在spring-mvc.xml里面就好了。楼主现在怎么解决的能贴出来嘛?我也遇到这个问题不要用声明式事务就好了,我现在用的就没问题了我也和你遇到一样的问题了。。。不知道如何接解决啊~~~

    0 0
相关问答

40

回答

[@徐雷frank][¥20]什么是JAVA的平台无关性

大河人家 2018-10-29 23:55:20 144291浏览量 回答数 40

162

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 223025浏览量 回答数 162

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 333891浏览量 回答数 8

13

回答

[@饭娱咖啡][¥20]我想知道 Java 关于引用那一块的知识

心意乱 2018-10-31 18:44:12 142143浏览量 回答数 13

38

回答

[@饭娱咖啡][¥20]对于慢sql有没有什么比较实用的诊断和处理方法?

江小白太白 2018-10-30 18:47:38 141680浏览量 回答数 38

110

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 292306浏览量 回答数 110

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 146802浏览量 回答数 22

17

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 643175浏览量 回答数 17

31

回答

[@倚贤][¥20]刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?

弗洛伊德6 2018-10-27 21:52:43 145640浏览量 回答数 31

10

回答

[@墨玖tao][¥20]为什么流式处理框架都是 java 写成的,JVM 是不是在流和批存在着特殊优势。还有分布式资源调度,感觉Mesos 的成长速度跟不上 Yarn。这是为什么?

管理贝贝 2018-10-23 13:18:03 136135浏览量 回答数 10
+关注
爱吃鱼的程序员
https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
2
文章
21569
问答
推荐问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载