关于DAO层的sessionFactory注入和是否继承HibernateDAOSupport

这个标题被我描述的太乱太杂了,其实要讲的主要是关于怎么得到用来操作数据层所使用的hibernateTemplate(另一个种方法是通过jdbcTemplate,但推荐使用第一种)。而hibernateTemplate是通过sessionFactory得到的,sessionFactory存在于hibernateDAOSupport来得到。(一切都是spring给我们封装好的)

这里的关键是怎么通过spring对DAO的操作得到我们要的hibernateTemplate

我们先看spring中的一段源码。

public final void setSessionFactory(SessionFactory sessionFactory) {
  if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
   	this.hibernateTemplate = createHibernateTemplate(sessionFactory);
  }
 }


还有一个final方法


public final HiberanteTemplate getHibernateTemplate()。。。。


也就是要得到hibernateTemplate就要先保证sessionFactory不是NULL,但是又因为这两个方法都是final所以,DAO层继承了这个hibernateDAOSupport之后不能重写, 所以这里就出现了下面几种可以得到hibernateTemplate的方法


①采用通过spring注入sessionFactory,前提是让DAO层继承hibernateDAOSupport,这样DAO类也就有了sessionFactory,然后通过在xml中编写进行注入。

这样使用起来的确是很方便(详情见后面代码)但是有不好的地方。其一你这个DAO层继承了hibernateDAOSupport之后,由于Java只能继承一个父类,便失去了继承其他的可能性。其二,这回增加耦合度,让代码至少不那么“干净透明”


②采用通过我不继承hibernateDAOSupport,而是直接给我的DAO层注入一个hibernateTemplate(因为我们的最终目标就是这个hibernateTemplate,我们注入sessionFactory是一个不得不为的行为,spring给我们的就是通过只要给spring一个sessionFactory,spring就还你一个hibernateTemplate)

这样的话每一个DAO层中都有一个对hibernateTemplate的set方法(为了注入),这样的确不用再去继承hibernateDAOSupport,可DAO层的代码中会多和关键操作无关的代码,如上面的set


还是看代码直接清晰,如下


采用第一种方法:

<!-- 以下为用户管理的依赖注入 -->
	<bean id="UserDao" class="org.nbu.lab1220.daoImpl.UserDaoImpl">
		<property name="sessionFactory">
			<ref local="sessionFactory" />
		</property>
	</bean>
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

	 
	public ArrayList<User> loginVaild(String userAccount, String password) {
		 
		return (ArrayList<User>) getHibernateTemplate().find("from User p where p.userAccount=? and p.password=?",new Object[]{userAccount,password});
	}}                                                                                                                                               


采用第二种方法:

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  		<property name="sessionFactory" ref="sessionFactory"></property>
 	</bean>
<bean id="UserDao" class="org.nbu.lab1220.daoImpl.UserDaoImpl">
 		<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>

public class UserDaoImpl   implements UserDao{
	
	private HibernateTemplate hibernateTemplate;
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}
	
	
	@SuppressWarnings("unchecked")
	public ArrayList<User> loginVaild(String userAccount, String password) {
		 
		return (ArrayList<User>) this.hibernateTemplate.find("from User p where p.userAccount=? and p.password=?",new Object[]{userAccount,password});
	}}




----------------------------------------------------------------------------------------------------------------------

今天意外发现

spring3.1里已经不提供hibernatedaosupport,hibernateTemplete了,只能用hibernate原生的session
 






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值