Spring与范型DAO类的结合

前一阵子发了一篇Hibernate官网上面的一个范型DAO类支持的笔记,只是这个DAO类是基于Hibernate的实现,最近在项目中也参考了这个 实现,并且与Spring结合在一起,加入了Spring的HibernateDaoSupport支持。具体代码如下。
IGenericDAO接口,这个接口与前一个帖子是一致的:
Java代码
  1. public interface IGenericDAO〈T, ID extends Serializable〉 {  
  2.   
  3.     // 通过ID检索对应的实体对象  
  4.     T findById(ID id, boolean lock);  
  5.   
  6.     // 列出所有的实体对象  
  7.     List〈T〉 findAll();  
  8.   
  9.     // 通过Example方法检索实体对象  
  10.     List〈T〉 findByExample(T exampleInstance);  
  11.   
  12.     // 产生持久化一个实体对象  
  13.     T makePersistent(T entity);  
  14.   
  15.     // 产生一个游离对象  
  16.     void makeTransient(T entity);  
  17. }  
public interface IGenericDAO〈T, ID extends Serializable〉 {  	// 通过ID检索对应的实体对象 	T findById(ID id, boolean lock);  	// 列出所有的实体对象 	List〈T〉 findAll();  	// 通过Example方法检索实体对象 	List〈T〉 findByExample(T exampleInstance);  	// 产生持久化一个实体对象 	T makePersistent(T entity);  	// 产生一个游离对象 	void makeTransient(T entity); } 

下面是针对IGenericDAO的实现,该类继承自Spring的HibernateDaoSupport,代码如下:
Java代码
  1. public abstract class GenericDAOHibernate〈T, ID extends Serializable, DAOImpl extends IGenericDAO〈T, ID〉〉  
  2.         extends HibernateDaoSupport implements IGenericDAO〈T, ID〉 {  
  3.     private Class〈T〉 persistentClass;  
  4.   
  5.     public GenericDAOHibernate() {  
  6.         this.persistentClass = (Class〈T〉) ((ParameterizedType) getClass()  
  7.                 .getGenericSuperclass()).getActualTypeArguments()[0];  
  8.     }  
  9.   
  10.     public Class〈T〉 getPersistentClass() {  
  11.         return persistentClass;  
  12.     }  
  13.   
  14.     @SuppressWarnings("unchecked")  
  15.     public T findById(ID id) {  
  16.         return (T) getHibernateTemplate().load(getPersistentClass(), id);  
  17.     }  
  18.   
  19.     @SuppressWarnings("unchecked")  
  20.     public T findById(ID id, boolean lock) {  
  21.         T entity;  
  22.         if (lock)  
  23.             entity = (T) getHibernateTemplate().load(getPersistentClass(), id,  
  24.                     LockMode.UPGRADE);  
  25.         else  
  26.             entity = findById(id);  
  27.   
  28.         return entity;  
  29.     }  
  30.   
  31.     public List〈T〉 findAll() {  
  32.         return findByCriteria();  
  33.     }  
  34.   
  35.     @SuppressWarnings("unchecked")  
  36.     public List〈T〉 findByExample(T exampleInstance) {  
  37.         DetachedCriteria detachedCrit = DetachedCriteria  
  38.                 .forClass(getPersistentClass());  
  39.         Example example = Example.create(exampleInstance);  
  40.         detachedCrit.add(example);  
  41.         return getHibernateTemplate().findByCriteria(detachedCrit);  
  42.     }  
  43.   
  44.     @SuppressWarnings("unchecked")  
  45.     public List〈T〉 findByExample(T exampleInstance, String[] excludeProperty) {  
  46.         DetachedCriteria detachedCrit = DetachedCriteria  
  47.                 .forClass(getPersistentClass());  
  48.         Example example = Example.create(exampleInstance);  
  49.         for (String exclude : excludeProperty) {  
  50.             example.excludeProperty(exclude);  
  51.         }  
  52.         detachedCrit.add(example);  
  53.         return getHibernateTemplate().findByCriteria(detachedCrit);  
  54.     }  
  55.   
  56.     public T makePersistent(T entity) {  
  57.         getHibernateTemplate().saveOrUpdate(entity);  
  58.         return entity;  
  59.     }  
  60.   
  61.     public void makeTransient(T entity) {  
  62.         getHibernateTemplate().delete(entity);  
  63.     }  
  64.   
  65.     @SuppressWarnings("unchecked")  
  66.     protected List〈T〉 findByCriteria(Criterion... criterion) {  
  67.         DetachedCriteria detachedCrit = DetachedCriteria  
  68.                 .forClass(getPersistentClass());  
  69.         for (Criterion c : criterion) {  
  70.             detachedCrit.add(c);  
  71.         }  
  72.         return getHibernateTemplate().findByCriteria(detachedCrit);  
  73.     }  
  74. }  
public abstract class GenericDAOHibernate〈T, ID extends Serializable, DAOImpl extends IGenericDAO〈T, ID〉〉 		extends HibernateDaoSupport implements IGenericDAO〈T, ID〉 { 	private Class〈T〉 persistentClass;  	public GenericDAOHibernate() { 		this.persistentClass = (Class〈T〉) ((ParameterizedType) getClass() 				.getGenericSuperclass()).getActualTypeArguments()[0]; 	}  	public Class〈T〉 getPersistentClass() { 		return persistentClass; 	}  	@SuppressWarnings("unchecked") 	public T findById(ID id) { 		return (T) getHibernateTemplate().load(getPersistentClass(), id); 	}  	@SuppressWarnings("unchecked") 	public T findById(ID id, boolean lock) { 		T entity; 		if (lock) 			entity = (T) getHibernateTemplate().load(getPersistentClass(), id, 					LockMode.UPGRADE); 		else 			entity = findById(id);  		return entity; 	}  	public List〈T〉 findAll() { 		return findByCriteria(); 	}  	@SuppressWarnings("unchecked") 	public List〈T〉 findByExample(T exampleInstance) { 		DetachedCriteria detachedCrit = DetachedCriteria 				.forClass(getPersistentClass()); 		Example example = Example.create(exampleInstance); 		detachedCrit.add(example); 		return getHibernateTemplate().findByCriteria(detachedCrit); 	}  	@SuppressWarnings("unchecked") 	public List〈T〉 findByExample(T exampleInstance, String[] excludeProperty) { 		DetachedCriteria detachedCrit = DetachedCriteria 				.forClass(getPersistentClass()); 		Example example = Example.create(exampleInstance); 		for (String exclude : excludeProperty) { 			example.excludeProperty(exclude); 		} 		detachedCrit.add(example); 		return getHibernateTemplate().findByCriteria(detachedCrit); 	}  	public T makePersistent(T entity) { 		getHibernateTemplate().saveOrUpdate(entity); 		return entity; 	}  	public void makeTransient(T entity) { 		getHibernateTemplate().delete(entity); 	}  	@SuppressWarnings("unchecked") 	protected List〈T〉 findByCriteria(Criterion... criterion) { 		DetachedCriteria detachedCrit = DetachedCriteria 				.forClass(getPersistentClass()); 		for (Criterion c : criterion) { 			detachedCrit.add(c); 		} 		return getHibernateTemplate().findByCriteria(detachedCrit); 	} } 

实际上这个GenericDAOHibernate类还是比较简单的,主要通过Spring的getHibernateTemplate()方法来实现通用的CRUD操作。
在上一个帖子中有朋友问到,使用了范型的DAO类后,如何通过Spring来注入这个DAO类,实际上,注入DAO类与不使用范型是一样的,比如说对于上一个帖子的UserDAOHibernate的注入:
Java代码
  1. <bean id="userDao"  
  2.         class="org.rainlife.dao.hibernate.UserDaoHibernate"  
  3.         autowire="byName"/>  
<bean id="userDao" 		class="org.rainlife.dao.hibernate.UserDaoHibernate" 		autowire="byName"/> 

这样就完成了对userDAO的注入。
posted on 2010-12-20 14:36  草原和大树  阅读(1274)  评论(0编辑  收藏  举报