我正在尝试在测试用例中访问当前的hibernate会话,并收到以下错误:
org.hibernate.HibernateException:没有 Hibernate会话绑定到线程,和 配置不允许创建 非交易的一个在这里 org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) 在 org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:574)
我显然错过了某种设置,但不确定是什么。
非常感谢任何帮助。这是我在Hibernate / Spring等的第一次破解,学习曲线肯定很陡峭!
代码如下:
违规类:
public class DbUnitUtil extends BaseDALTest {
@Test
public void exportDtd() throws Exception
{
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Connection hsqldbConnection = session.connection();
IDatabaseConnection connection = new DatabaseConnection(hsqldbConnection);
// write DTD file
FlatDtdDataSet.write(connection.createDataSet(), new FileOutputStream("test.dtd"));
}
}
基类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class BaseDALTest extends AbstractJUnit4SpringContextTests {
public BaseDALTest()
{
super();
}
@Resource
protected SessionFactory sessionFactory;
}
的applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<property name="url">
<value>jdbc:hsqldb:mem:sample</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="sessionFactory" class="com.foo.spring.AutoAnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="entityPackages">
<list>
<value>com.sample.model</value>
</list>
</property>
<property name="schemaUpdate">
<value>true</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
</beans>
答案 0 :(得分:31)
错了,这只会用会话管理代码填充你的代码。
首先,在您的上下文中添加一个事务管理bean:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
第二件事,扩展AbstractTransactionalJUnit4SpringContextTests
public class BaseDALTest
extends AbstractTransactionalJUnit4SpringContextTests{
第三件事,用
注释你的测试类 @TransactionConfiguration
@Transactional
如果您的交易分界正确(围绕您的道路或服务),您应该完成。
在代码周围(甚至在测试中)撒上会话和事务处理代码并不好。
答案 1 :(得分:5)
请参阅Spring文档。有一整章关于测试,以及关于事务管理的一节:
我已成功扩展AbstractTransactionalJUnit4SpringContextTests,但有一个解决方法:
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// DAO has access to the session through sessionFactory.getCurrentSession()
myDao.findSomething(id);
}
});
答案 2 :(得分:2)
使用上面的Spring配置,代码
就足够了Session session = sessionFactory.getCurrentSession();
在你的方法和类中进行测试。会话管理由Hibernate / Spring / JUnit测试配置完成,稍后将在 real 应用程序中的Hibernate / Spring配置中完成。
这是我的测试的工作方式。在最终的Web应用程序中,将自动存在与当前Web请求关联的Hibernate会话,因此在测试中应该没有sessionFactory.openSession()
调用。
答案 3 :(得分:0)
咄。
会话会话= <德尔> sessionFactory.openSession(); 德尔>
Session session = sessionFactory.getCurrentSession();
糟糕。
(编辑,因为这是错误的,并且上升了)。
答案 4 :(得分:0)
Spring忽略hibernate.current_session_context_class=thread
属性(你不使用)并将Hibernate的SessionFactory
包装在它自己的事务版本中,如解释here
解决方法是设置属性
<property name="exposeTransactionAwareSessionFactory"><value>false</value></property>
会话工厂bean配置中的