spring整合Hibernate使用set方式注入sessionFactory问题

来源:互联网 发布:海龟交易源码 编辑:程序博客网 时间:2024/05/21 06:30

在搭建SSH框架的时候在处理dao层sessionFactory注入的时候遇到一个问题,总是报sessionFactory没有注入成功,其中bean的配置如下所示

<bean id="loginDao" class="cn.com.demo.dao.impl.LoginDaoImpl" scope="prototype"><property name="sessionFactory" ref="sessionFactory"></property></bean>

我使用的是spring2 + hibernate4在dao实现层开始用的是extends HibernateDaoSupport的方式不行,换成extends HibernateTemplate也不行。

解决这个问题我们要搞清楚spring是怎么通过set方式注入依赖的需要配置哪些东西。

1.首先需要在bean中配置需要注入依赖的属性,如上面的代码所示

2.在需要注入依赖的类中配置一个属性,用于接收通过set方法注入的值

3.添加相应的set方法用于spring注入,这个set方法名是set + bean中配置的name对应的值,即加入xml中bean的配置种的name为sessionDemo那么spring就会通过setSessionDemo方法去注入

明确这点就好办了,接着查看了HibernateDaoSupport和HibernateTemplate源码,先看HibernateDaoSupport的源码,源码中我们发现有一个final修饰的setSessionFactory方法,我们知道final修饰的方法是不能被重写的,但是可以被继承,所以子类中是有setSessionFactory。满足了set注入的3条件,因为1中的条件已经满足所以现在只需要确定是否满足2即可。2中所有需要有属性来接收注入的值,我们继续看源码中的setSessionFactory方法,HibernateDaoSupport中是用注入的sessionFactory生成了HibernateTmeplate,并赋值给了hibernateTemplate参数。因此2也是满足的,所以只需要改成下面的代码即可注入成功。

package cn.com.demo.dao.impl;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.orm.hibernate4.support.HibernateDaoSupport;import cn.com.jnpc.dao.LoginDao;import cn.com.jnpc.entity.User;/** * loginDao持久层 * @author Uself 2017-10-17 下午3:15:11 * */public class LoginDaoImpl extends HibernateDaoSupport implements LoginDao{/** * 根据userName获取User信息 */@Overridepublic User getUserByUserName(String userName) {User user = null;String hql = "from User where user_name = '" + userName + "'";SessionFactory sessionFactory = this.getSessionFactory();Session session = sessionFactory.openSession();Query query = session.createQuery(hql);List list = query.list();if(list != null && list.size() > 0){user = (User) list.get(0);}session.close();return user;}}
同样的继承HibernateTemplate也是类似,查看源码并和上面的三点一一对应就能正确的注入,代码如下
package cn.com.demo.dao.impl;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.orm.hibernate4.HibernateTemplate;import cn.com.jnpc.dao.LoginDao;import cn.com.jnpc.entity.User;/** * loginDao持久层 * @author Uself 2017-10-17 下午3:15:11 * */public class LoginDaoImpl extends HibernateTemplate implements LoginDao{/** * 根据userName获取User信息 */@Overridepublic User getUserByUserName(String userName) {User user = null;String hql = "from User where user_name = '" + userName + "'";SessionFactory sessionFactory = this.getSessionFactory();Session session = sessionFactory.openSession();Query query = session.createQuery(hql);List list = query.list();if(list != null && list.size() > 0){user = (User) list.get(0);}session.close();return user;}}
值得注意的是,spring和hibernate版本之间的差异很大,如果直接使用上面的代码还是不行,就要具体的情况具体分析,也就是要去查看源码确定是否是和上面的情况类似,但是总体的思路是不变的。


阅读全文
0 0
原创粉丝点击