Spring与范型DAO类的结合

前一阵子发了一篇Hibernate官网上面的一个范型DAO类支持的笔记,只是这个DAO类是基于Hibernate的实现,最近在项目中也参考了这个实现,并且与Spring结合在一起,加入了Spring的HibernateDaoSupport支持。具体代码如下。
IGenericDAO接口,这个接口与前一个帖子是一致的:
Java代码
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的注入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值