前一阵子发了一篇Hibernate官网上面的一个范型DAO类支持的笔记,只是这个DAO类是基于Hibernate的实现,最近在项目中也参考了这个 实现,并且与Spring结合在一起,加入了Spring的HibernateDaoSupport支持。具体代码如下。

IGenericDAO接口,这个接口与前一个帖子是一致的:

Java代码


  1. public interface IGenericDAO〈T, ID extends Serializable〉 {

  2. // 通过ID检索对应的实体对象
  3. T findById(ID id, boolean lock);

  4. // 列出所有的实体对象
  5. List〈T〉 findAll();

  6. // 通过Example方法检索实体对象
  7. List〈T〉 findByExample(T exampleInstance);

  8. // 产生持久化一个实体对象
  9. T makePersistent(T entity);

  10. // 产生一个游离对象
  11. void makeTransient(T entity);
  12. }


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. public GenericDAOHibernate() {
  5. this.persistentClass = (Class〈T〉) ((ParameterizedType) getClass()
  6. .getGenericSuperclass()).getActualTypeArguments()[0];
  7. }

  8. public Class〈T〉 getPersistentClass() {
  9. return persistentClass;
  10. }

  11. @SuppressWarnings("unchecked")
  12. public T findById(ID id) {
  13. return (T) getHibernateTemplate().load(getPersistentClass(), id);
  14. }

  15. @SuppressWarnings("unchecked")
  16. public T findById(ID id, boolean lock) {
  17. T entity;
  18. if (lock)
  19. entity = (T) getHibernateTemplate().load(getPersistentClass(), id,
  20. LockMode.UPGRADE);
  21. else
  22. entity = findById(id);

  23. return entity;
  24. }

  25. public List〈T〉 findAll() {
  26. return findByCriteria();
  27. }

  28. @SuppressWarnings("unchecked")
  29. public List〈T〉 findByExample(T exampleInstance) {
  30. DetachedCriteria detachedCrit = DetachedCriteria
  31. .forClass(getPersistentClass());
  32. Example example = Example.create(exampleInstance);
  33. detachedCrit.add(example);
  34. return getHibernateTemplate().findByCriteria(detachedCrit);
  35. }

  36. @SuppressWarnings("unchecked")
  37. public List〈T〉 findByExample(T exampleInstance, String[] excludeProperty) {
  38. DetachedCriteria detachedCrit = DetachedCriteria
  39. .forClass(getPersistentClass());
  40. Example example = Example.create(exampleInstance);
  41. for (String exclude : excludeProperty) {
  42. example.excludeProperty(exclude);
  43. }
  44. detachedCrit.add(example);
  45. return getHibernateTemplate().findByCriteria(detachedCrit);
  46. }

  47. public T makePersistent(T entity) {
  48. getHibernateTemplate().saveOrUpdate(entity);
  49. return entity;
  50. }

  51. public void makeTransient(T entity) {
  52. getHibernateTemplate().delete(entity);
  53. }

  54. @SuppressWarnings("unchecked")
  55. protected List〈T〉 findByCriteria(Criterion... criterion) {
  56. DetachedCriteria detachedCrit = DetachedCriteria
  57. .forClass(getPersistentClass());
  58. for (Criterion c : criterion) {
  59. detachedCrit.add(c);
  60. }
  61. return getHibernateTemplate().findByCriteria(detachedCrit);
  62. }
  63. }


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的注入。