浏览 9304 次
锁定老帖子 主题:Spring与范型DAO类的结合
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-20
IGenericDAO接口,这个接口与前一个帖子是一致的: 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,代码如下: 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的注入: <bean id="userDao" class="org.rainlife.dao.hibernate.UserDaoHibernate" autowire="byName"/> 这样就完成了对userDAO的注入。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-08
请问:public abstract class GenericDAOHibernate〈T, ID extends Serializable, DAOImpl extends IGenericDAO〈T, ID〉〉
extends HibernateDaoSupport implements IGenericDAO〈T, ID〉 中的这句DAOImpl extends IGenericDAO《T, ID》是做什么用的? 另外,用了这种泛型dao之后,那dao就有了类变量persistentClass, 是不是就不能singleton="true" |
|
返回顶楼 | |
发表时间:2007-05-08
先收藏了,以后再看。现在范型还是看起来不太舒服。。。
|
|
返回顶楼 | |
发表时间:2007-05-08
二十一 写道 这句DAOImpl extends IGenericDAO《T, ID》是做什么用的?
另外,用了这种泛型dao之后,那dao就有了类变量persistentClass, 是不是就不能singleton="true" 用来限制DAOImpl类 , DAOImpl 必须实现IGenericDAO接口 二十一 写道 用了这种泛型dao之后,那dao就有了类变量persistentClass,
是不是就不能singleton="true" 需要考虑线程安全问题。 |
|
返回顶楼 | |
发表时间:2007-05-10
一个类型一个DAO 而不用泛型,就是为了解决隔离修改,比如某个类变化了,DAO不变。泛型背道而驰?
|
|
返回顶楼 | |
发表时间:2007-05-10
zeeeitch 写道 一个类型一个DAO 而不用泛型,就是为了解决隔离修改,比如某个类变化了,DAO不变。泛型背道而驰?
对于DAO的通用操作,只要不涉及到model类的具体属性,就算model类变化了,泛型的DAO应该不用修改 但是,如果要为某个model类的DAO增加一个特定的方法,或者在DAO的方法中需要执行特别的处理,如何在利用泛型的同时,又能实现类似C++中的特化(specialize)呢? |
|
返回顶楼 | |
发表时间:2007-05-21
呵呵,我现在用的是hibenatedao和你的有点相视,但是用法不通,我的所有manager都用的是这个dao来操作数据库,比如:userManager,用spring把现在这个dao注入就可以了,没有必要一个manager对应一个dao(以前我就是这样干的)
<bean id="userManager" class="xxx.xxx.xxx.DefaultUserManager"> <property name="hibernateDao"> <ref bean="hibernateDao"/> </property> </bean> |
|
返回顶楼 | |
发表时间:2007-05-21
涉及到很多问题,只能贴一点点代码出来:
贴一点点代码: public <T extends Model> T store(T model) { this.getHibernateTemplate().saveOrUpdate(model); return (T) this.load(model.getClass(),model.getId()); } public <T extends Model> T load(Class<T> clazz,Long id) { return (T) this.getHibernateTemplate().get(clazz,id); } |
|
返回顶楼 | |