我不确定使用Spring3将Hibernate的会话实例注入DAO类的最佳方法是什么。我没有为此使用Spring的Hibernate Template支持,所以这是我在DAO类中拥有的代码。
public void setSessionFactory(SessionFactory sessionFactory){ this.sessionFactory=sessionFactory; } public SessionFactory getSessionFactory(){ log.info("Returning a refrence to the session instance"); if(sessionFactory==null){ log.error("Not able to find any associated session"); throw new RuntimeException("Not able to find any associated session"); } return sessionFactory; }
下面是将会话注入此方法的代码
<bean id="genericSessionFactory" class="HibernateSessionFactory" factory-method="getSessionfactory" scope="prototype/>
我不确定这是否是进行SessionFactory注入的最佳方法,因为我们不想在项目中使用Spring模板。因此,任何其他改进建议都将很有帮助。
在Spring参考建议这种用法:
public class ProductDaoImpl implements ProductDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Collection loadProductsByCategory(String category) { return this.sessionFactory.getCurrentSession() .createQuery( "from test.Product product where product.category=?") .setParameter(0, category) .list(); } }
这样,你的类就不会对Spring有任何依赖,你只需使用普通的Hibernate。
@Respository("productDao") public class ProductDaoImpl implements ProductDao { @Autowired private SessionFactory sessionFactory; public Collection loadProductsByCategory(String category) { return this.sessionFactory.getCurrentSession() .createQuery( "from test.Product product where product.category=?") .setParameter(0, category) .list(); } }
XML文件
<beans> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource"/> <property name="mappingResources"> <list> <value>product.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.HSQLDialect </value> </property> </bean> </beans>