实体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方法的。