问题描述
Person类:public class Person {private int id;private String name;private Date born;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBorn() {return born;}public void setBorn(Date born) {this.born = born;}}Person的配置文件:<class name="Person"><id name="id"><generator class="increment"></generator></id><property name="name"></property><property name="born" type="date"></property></class>PersonDao接口:public interface PersonDao{public Person get(int id);}PersonDaoImpl实现类:public class PersonDaoImpl implements PersonDao{private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}@Overridepublic Person get(int id) {return (Person) this.sessionFactory.getCurrentSession().load(Person.class, id);}}beanx.xml文件: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url"> <value>jdbc:oracle:thin:@127.0.0.1:1521:myoracle</value> </property> <property name="username"> <value>xiaoming</value> </property> <property name="password"> <value>m123</value> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref local="dataSource"/> </property> <property name="mappingResources"> <list> <value>com/sunyan/bean/Person.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> --> </props> </property> </bean> <bean id="personDaoImpl" class="com.sunyan.impl.PersonDaoImpl"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean>测试代码:FileSystemXmlApplicationContext appContext = new FileSystemXmlApplicationContext(new String[]{"classpath:beans.xml"});BeanFactory factory = (BeanFactory) appContext;PersonDao pdi = (PersonDao) factory.getBean("personDaoImpl");Person p = (Person) pdi.get(77);System.out.println(p.getBorn()+" "+p.getName());出错提示:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 问题补充:Wind_ZhongGang 写道
解决方案
有一点我不明白,你的Dao为什么不直接继承HibernateDaoSupport而是向Dao中注入SessionFactory。如果你同时也使用了Spring框架,那么你可以在配置文件中声明事务,就像这样。<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="service" expression="execution(* com.hibernate..*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="service"/> </aop:config>如果不是那你就得实现编程式的事务处理,有这样几个类可以去看看,TranactionManager,TransactionTemplate,这些提供了事务支持。
解决方案二:
没有事务包围,你得加上事务。