一尘不染

Spring / Hibernate / JUnit-没有Hibernate Session绑定到线程

hibernate

我正在尝试在一个测试用例中访问当前的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>

阅读 257

收藏
2020-06-20

共1个答案

一尘不染

错误的,那只会用会话管理代码填充您的代码。

首先,在您的上下文中添加一个事务管理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或服务),则应该完成。

在代码周围(甚至在测试内部)撒满会话和事务处理代码不是很好。

2020-06-20