我正在尝试在一个测试用例中访问当前的hibernate会话,并收到以下错误:
org.hibernate.HibernateException:没有绑定到线程的Hibernate会话,并且配置不允许在org.hibernate.impl的org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)处创建非事务性会话。 .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>
错误的,那只会用会话管理代码填充您的代码。
首先,在您的上下文中添加一个事务管理bean:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean>
第二件事,扩展AbstractTransactionalJUnit4SpringContextTests
public class BaseDALTest extends AbstractTransactionalJUnit4SpringContextTests{
第三件事,用
@TransactionConfiguration @Transactional
如果您的交易分界是正确的(围绕dao或服务),则应该完成。
在代码周围(甚至在测试内部)撒满会话和事务处理代码不是很好。