2011-10-21 108 views
1

我正在嘗試寫一個簡單的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. 我們如何爲每個線程配置一個會話?我相信問題是沒有會話與我的執行線程相關聯。我假設事務管理器會打開一個會話,如果尚未找到,但它不會這樣做。

回答

相關問題