2007-04-20
Spring与范型DAO类的结合
关键字: Spring与范型DAO类的结合
前一阵子发了一篇Hibernate官网上面的一个范型DAO类支持的笔记,只是这个DAO类是基于Hibernate的实现,最近在项目中也参考了这个实现,并且与Spring结合在一起,加入了Spring的HibernateDaoSupport支持。具体代码如下。
IGenericDAO接口,这个接口与前一个帖子是一致的:
下面是针对IGenericDAO的实现,该类继承自Spring的HibernateDaoSupport,代码如下:
实际上这个GenericDAOHibernate类还是比较简单的,主要通过Spring的getHibernateTemplate()方法来实现通用的CRUD操作。
在上一个帖子中有朋友问到,使用了范型的DAO类后,如何通过Spring来注入这个DAO类,实际上,注入DAO类与不使用范型是一样的,比如说对于上一个帖子的UserDAOHibernate的注入:
这样就完成了对userDAO的注入。
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的注入。
评论
xfli333
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);
}
贴一点点代码:
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);
}
xfli333
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>
<bean id="userManager" class="xxx.xxx.xxx.DefaultUserManager">
<property name="hibernateDao">
<ref bean="hibernateDao"/>
</property>
</bean>
movingboy
2007-05-10
zeeeitch 写道
一个类型一个DAO 而不用泛型,就是为了解决隔离修改,比如某个类变化了,DAO不变。泛型背道而驰?
对于DAO的通用操作,只要不涉及到model类的具体属性,就算model类变化了,泛型的DAO应该不用修改
但是,如果要为某个model类的DAO增加一个特定的方法,或者在DAO的方法中需要执行特别的处理,如何在利用泛型的同时,又能实现类似C++中的特化(specialize)呢?
zeeeitch
2007-05-10
一个类型一个DAO 而不用泛型,就是为了解决隔离修改,比如某个类变化了,DAO不变。泛型背道而驰?
rainlife
2007-05-08
二十一 写道
这句DAOImpl extends IGenericDAO《T, ID》是做什么用的?
另外,用了这种泛型dao之后,那dao就有了类变量persistentClass,
是不是就不能singleton="true"
另外,用了这种泛型dao之后,那dao就有了类变量persistentClass,
是不是就不能singleton="true"
用来限制DAOImpl类 , DAOImpl 必须实现IGenericDAO接口
二十一 写道
用了这种泛型dao之后,那dao就有了类变量persistentClass,
是不是就不能singleton="true"
是不是就不能singleton="true"
需要考虑线程安全问题。
spiritfrog
2007-05-08
先收藏了,以后再看。现在范型还是看起来不太舒服。。。
二十一
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"
extends HibernateDaoSupport
implements IGenericDAO〈T, ID〉
中的这句DAOImpl extends IGenericDAO《T, ID》是做什么用的?
另外,用了这种泛型dao之后,那dao就有了类变量persistentClass,
是不是就不能singleton="true"
ecsun
2007-04-21
曾经在hibernate官方看到过这样的设计思路,后来描述在了Hibernate In Action中,在Spring side中大量使用了范型这种特性,效果感觉不错,但到底一个项目中使用不使用范型,还要跟公司的具体情况相结合,毕竟,J2EE领域已经走过这么多年,每个生存下来的公司,都有所沉淀,重新洗牌,有时候会付出沉重的代价,同时,范型是一把双韧剑,全面子解之后,再做决定。
- 浏览: 58359 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
image008
共 11 张
共 11 张
最近加入圈子
最新评论
-
Struts2学习笔记4 ――国 ...
统一使用utf-8编码,properties文件中的中文会变编译为utf-8编码 ...
-- by ember_319 -
javascript的消息资源国际 ...
我的做法是在产品初次启动的时候去过滤JS文件,然后使用Spring标签国际化。不 ...
-- by longleg -
javascript的消息资源国际 ...
navigator.userLanguage 这个只能获取 浏览器 设置的 L ...
-- by wucc1986 -
Struts2学习笔记4 ――国 ...
我在做Struts2的国际化的时候将properties文件中的中文全部用nat ...
-- by fornever -
Rails生成Ext Tree
无明 写道nested tree有2个缺点比较明显: 1、单纯的nested t ...
-- by rainlife






评论排行榜