边做边学小型封装--利用主流框架进行Dao层通用化,Spring3.0+Hibernate3.3.2通用Dao层整合(三)

     实体Bean创建完毕后,接下来就是关键的Dao层了,为了使各个实体Bean可以只通过一个Dao层进行基本的增删改查,我们采用了JDK1.5里面的新特性泛型进行配置.这里只是简单说明BasicDaoImpl的实现方法,代码如下:

package org.lxh.dao.impl;



import java.io.Serializable;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

import org.lxh.dao.interfaces.BasicDaoIf;

import org.springframework.stereotype.Repository;



@Repository("basicDao")

public  class BasicDaoImpl<T,PK extends Serializable>extends BasicSupportDao implements BasicDaoIf<T, PK> {



	@Override

	public boolean deleteAll(final T t) {

		getHibernateTemplate().deleteAll(this.findAll((Class<T>)t.getClass()));

		return true;

	}



	@Override

	public boolean deleteById(final Class<T> entityClass,final PK id) {

		getHibernateTemplate().delete(this.findById(entityClass,id));

		return true;

	}



	@Override

	public List<T> findAll(final Class<T> entityClass) {

		 

		return getHibernateTemplate().findByCriteria(DetachedCriteria.forClass(entityClass));

	}



	@Override

	public T findById(final Class<T> entityClass,final PK id) {

		 

		return (T)getHibernateTemplate().get(entityClass, id);

	}



	@Override

	public boolean save(final T t) {

		getHibernateTemplate().save(t);

		return true;

	}



	@Override

	public boolean update(final T t) {

		getHibernateTemplate().update(t);

		return true;

	}



}


Dao层的实现采用SpringJpa的方式,里面的Repository相当于xml中<bean>里面内容,而basicDao是等同于<bean id=”basicDao”></bean>从类中发现除了引用了接口之外,还会发现继承了一个BasicSupportDao ,BasicSupportDao 目前功能只有一个用于继承Spring中的HibernateDaoSupport,然后把HibernateTemplate注入,如果不采用这个方法的话而采用直接extends HibernateDaoSupport会出现以下错误代码:"org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'basicDao' is defined”,因为Spring在采用JPA定义的时候会把当前类实例化,如果继承了HibernateDaoSupport的话,因为HibernateDaoSupport源码中SessionFactory和HibernateTemplate是final的不能修改的,所以会报错不能从Spring配置文件中注入,所以必须要新创建一个BasicSupportDao用来代替。代码如下:

package org.lxh.dao.impl;



import javax.annotation.Resource;

import org.springframework.orm.hibernate3.HibernateTemplate;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;



public class BasicSupportDao extends HibernateDaoSupport {

	

	@Resource(name="hibernateTemplate")

	public void setHibernatetemplate(HibernateTemplate hibernateTemplate){

		super.setHibernateTemplate(hibernateTemplate);

	}



}
其中@Resource(name=" hibernateTemplate") 是用于指向Spring中配置的xml文件里面bean的id名字为 hibernateTemplate,也可以指向@Service、@Repository、@Component所对应的名字,除了上面的方法可以在BasicDaoImpl中加入Spring中Hibernate的模板,hibernateTemplate,生成getter、setter方法,也可以运行通过不会报错,在Spring3.0中的例子是比较推荐使用这种直接加入hibernateTemplate方法的。
注意:如果在public class BasicDaoImpl class 前面加入 abstract 的话也会出现找不到basicDao这个错误的,解决方法暂时没有找到

你可能感兴趣的:(hibernate3)