为什么在Spring 3.1和hibernate 4中找到当前线程exception的No Session

我试图配置spring 3.1和hibernate。 我写了一个简单的测试项目。 我有用户域和userDao及其实现

让我告诉你appliationContext

                 ${hibernate.dialect} ${hibernate.show_sql} ${hibernate.connection.pool_size} ${hibernate.show_sql} ${hibernate.hbm2ddl.auto} true=1 false=0    

和UserDaoImpl的一部分

  @Repository public class UserDaoImpl implements UserDao { @Autowired private SessionFactory sessionFactory; @Override public User getUser(Long userId) { if (userId != null && userId > 0) { return (User) sessionFactory.getCurrentSession().get(User.class, userId); } return null; } @Override public void updateUser(User user) { if (user != null) { sessionFactory.getCurrentSession().update(user); } } 

好像没事。 但是当我试图运行我的测试用例时,我就是这个例外。

 org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:881) at com.rokonoid.apps.user.dao.UserDaoImpl.saveUser(UserDaoImpl.java:197) at com.rokonoid.apps.test.UserDaoTest.setUserTest(UserDaoTest.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 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) 

任何forms的帮助表示赞赏。

谢谢

编辑:

以前的问题解决了,我有另一个问题:现在我得到了

 java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session; at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:328) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 

您必须将传播设置为“REQUIRED”,如下所示:

       

我不知道这是不是一个spring的虫子。

您的示例项目中没有事务。 加:

  

并用@Transactional注释你的DAO:

 @Transactional @Repository public class UserDaoImpl implements UserDao 

两个说明:

  • 您正在使用@Repository正确标记DAO,但它只处理exception转换:

    这样注释的类符合Spring DataAccessException转换的条件

  • 考虑将@Transactional放在更高级别的类( @Service s)上,请参阅在DAO中使用Spring MVC和Hibernate的正确方法,服务层架构进行讨论

更新到最新的jar。 他们是jira创造的。

https://jira.springsource.org/browse/SPR-8776