diyagea的gravatar头像
diyagea 2014-09-29 10:52:39

spring管理hibernate4 transaction getCurrentSession为什么报错?

spring管理hibernate transaction 在service层业务方法上注解@Transactional,业务方法中调用DAO中的save方法,然后DAO中save方法sessionFactory.getCurrentSession()就报错,管理事务不能用openSession,请教了学校老师,被含糊的说了一堆不相关的,一点用都没,请高手帮帮忙

不知道是不是版本的问题,我在学习的时候书上是spring3+hibernate3可以实现,我现在用的spring4+hibernate4,(细节配置也做了改动,应该没有错)

spring配置文件:(在网上看了很多文章,各种配置都试了好几遍,结果还是不行)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <context:annotation-config />
    <context:component-scan base-package="com.diyagea" />

    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>

    <bean id="dataSource" destroy-method="close"
        class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName"
            value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.diyagea.model.User</value>
                <value>com.diyagea.model.Log</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
            <!--     <prop key="hibernate.current_session_context_class">thread</prop>
                <prop key="hibernate.current_session_context_class">
                    org.springframework.orm.hibernate4.SpringSessionContext
                </prop>   -->
                
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

     <bean id="txManager"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    
    <tx:annotation-driven transaction-manager="txManager"/>
 
</beans>

错误信息如下:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
    at com.diyagea.DAO.impl.UserDAOImpl.save(UserDAOImpl.java:31)
    at com.diyagea.service.UserService.addUser(UserService.java:42)
    at com.diyagea.service.UserServiceTest.testAddUser(UserServiceTest.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

 

所有回答列表(6)
Even的gravatar头像
Even  LV5 2014年9月29日

spring事物的问题: 1.service里面方法名对不对 2.有没有扫描错包  3.加入<aop:aspectj-autoproxy/> 

Spring4+Hibernate4事务小记:http://www.cnblogs.com/GarfieldTom/p/3422574.html

评论(0) 最佳答案
sayHelloWorld的gravatar头像
sayHelloWorld  LV22 2014年9月29日

给你个地址,自己仔细看看吧.别人帮你找出问题的所在,自己永远不会进步的.

http://wenku.baidu.com/link?url=OimQ-55pxZvbAF6EB24aNP4XEJxzfPQEE1Q8gixNlbzPS8coXpuNoekV08ij4aIkQU3P3WC0v0FteFXqgYQuyGHD9lzigQGJuhObHIQ9fH3

zshengz的gravatar头像
zshengz  LV2 2014年9月29日

看看配置里面有没有对应的bean,使用注解@ ,配置文件中应该有相应bean的声明

yangjj0520的gravatar头像
yangjj0520  LV5 2014年10月5日

hibernate4不支持你用hibernate3的 getcurrentSession,建议你用openSession

whz123的gravatar头像
whz123  LV9 2015年10月16日

你需要在Service层加上一个@Transactional的注解

s514267445的gravatar头像
s514267445 2017年9月8日

2楼什么心态?二 逼

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友