我正在嘗試寫一個簡單的spring-hibernate 命令行應用程序,並提供事務管理支持,但是我我經常收到 「org.hibernate.HibernateException:沒有Hibernate的Session綁定到線程,配置不允許非事務一個在這裏創造了」在執行spring hibernate的同時獲取「HibernateException:沒有Hibernate Session綁定到線程,&config不允許創建..」
我的Spring配置文件(applicationContext.xml中)
<!-- Context Provider -->
<bean class="com.rps.util.ContextUtil" />
<!-- The transactional service objects -->
<bean id="service" class="com.rps.service.DefaultService" p:parentDao-ref="parentDao" p:childDao-ref="childDao" />
<!--the transactional advice-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!--this transactional advice runs for any service method execution-->
<aop:config>
<aop:advisor pointcut="execution(* com.rps.service..*.*(..))" advice-ref="txAdvice" />
</aop:config>
<!-- The PlatformTransactionManager -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory" />
<!-- The DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/OsivTest" p:username="XXX" p:password="YYY" />
<!-- Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" p:dataSource-ref="dataSource">
<property name="mappingResources">
<list>
<value>com/rps/domain/Parent.hbm.xml</value>
<value>com/rps/domain/Child.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- Data Access Objects -->
<bean id="parentDao" class="com.rps.data.hbm.HibernateParentDao" p:sessionFactory-ref="sessionFactory" />
<bean id="childDao" class="com.rps.data.hbm.HibernateChildDao" p:sessionFactory-ref="sessionFactory" />
(可以通過設置在上述背景下文件由IoC容器設置會話工廠對象)
public List<T> findAll() {
return sessionFactory.getCurrentSession().createCriteria(getPersistentClass()).list();
}
DefaultService類
DAO代碼:(parentDao從IoC容器注入)
public class DefaultService implements Service {
@Override
public List<Parent> getAllParent() {
return parentDao.findAll();
}
//Other methods
}
主要方法的代碼:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Service s = (Service) context.getBean("service");
s.getAllParent();
}
我正在使用休眠版本3.1.3和彈簧3. 我們如何爲每個線程配置一個會話?我相信問題是沒有會話與我的執行線程相關聯。我假設事務管理器會打開一個會話,如果尚未找到,但它不會這樣做。
謝謝...我會嘗試用最新版本。 – rsingh25