关于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


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


采用第一种方法:


	
		
			
		
	
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

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


采用第二种方法:


  		
 	

 		

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 loginVaild(String userAccount, String password) {
		 
		return (ArrayList) this.hibernateTemplate.find("from User p where p.userAccount=? and p.password=?",new Object[]{userAccount,password});
	}}




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

今天意外发现

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






你可能感兴趣的:(SSH)