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

在搭建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信息
	 */
	@Override
	public 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信息
	 */
	@Override
	public 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版本之间的差异很大,如果直接使用上面的代码还是不行,就要具体的情况具体分析,也就是要去查看源码确定是否是和上面的情况类似,但是总体的思路是不变的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值