为什么在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创造的。
- JPA和Hibernate中@MapKey,@ MapKeyColumn和@MapKeyJoinColumn的区别
- 无法在一对多关系hibernate注释中插入null
- hibernate没有创建表但没有错误消息
- Oracle将空字符串视为Java / JPA程序员的NULL问题
- org.hibernate.StaleStateException:批量更新从update 返回意外的行数; 实际行数:0; 预期:1
- Hibernate / Toplink在JPA之上提供什么?
- Hibernate多态查询
- Hibernate Sequence Id Specification
- Hibernate – 避免LazyInitializationException – 从代理和会话中分离对象