`
rainlife
  • 浏览: 232887 次
  • 性别: Icon_minigender_1
  • 来自: 我也来自火星?
社区版块
存档分类
最新评论

Spring与范型DAO类的结合

阅读更多
前一阵子发了一篇Hibernate官网上面的一个范型DAO类支持的笔记,只是这个DAO类是基于Hibernate的实现,最近在项目中也参考了这个实现,并且与Spring结合在一起,加入了Spring的HibernateDaoSupport支持。具体代码如下。
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的注入。
分享到:
评论
7 楼 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);
}
6 楼 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>
5 楼 movingboy 2007-05-10  
zeeeitch 写道
一个类型一个DAO 而不用泛型,就是为了解决隔离修改,比如某个类变化了,DAO不变。泛型背道而驰?

对于DAO的通用操作,只要不涉及到model类的具体属性,就算model类变化了,泛型的DAO应该不用修改
但是,如果要为某个model类的DAO增加一个特定的方法,或者在DAO的方法中需要执行特别的处理,如何在利用泛型的同时,又能实现类似C++中的特化(specialize)呢?
4 楼 zeeeitch 2007-05-10  
一个类型一个DAO 而不用泛型,就是为了解决隔离修改,比如某个类变化了,DAO不变。泛型背道而驰?
3 楼 rainlife 2007-05-08  
二十一 写道
这句DAOImpl extends IGenericDAO《T, ID》是做什么用的?
另外,用了这种泛型dao之后,那dao就有了类变量persistentClass,  
是不是就不能singleton="true"

用来限制DAOImpl类 , DAOImpl 必须实现IGenericDAO接口
二十一 写道
用了这种泛型dao之后,那dao就有了类变量persistentClass,  
是不是就不能singleton="true"

需要考虑线程安全问题。
2 楼 spiritfrog 2007-05-08  
先收藏了,以后再看。现在范型还是看起来不太舒服。。。
1 楼 二十一 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"

相关推荐

    《分布式系统原理与范型》.pdf

    《分布式系统原理与范型》作为一本系统介绍分布式系统基本原理与实践应用的书籍,涵盖了分布式系统设计与实现的核心理念。分布式系统指的是由多个可以独立运行的计算单元构成的系统,这些计算单元通过通信网络相互...

    分布式系统原理与范型答案(第二版)答案

    分布式系统原理与范型是计算机科学中的一个重要领域,它涵盖了多台计算机如何通过网络协同工作,以实现一个共同的目标。《分布式系统原理与范型(第二版)》这本书深入浅出地介绍了这一主题,旨在帮助读者理解分布式...

    分布式系统原理与范型

    《分布式系统原理与范型》是分布式系统中的经典教材,全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了...

    分布式系统-原理与范型(第2版)

    分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版)

    分布式系统原理与范型(第二版)

    分布式系统原理与范型是IT领域中至关重要的一个主题,特别是在云计算、大数据处理以及现代互联网服务的背景下,理解和掌握分布式系统的概念与实践至关重要。本书作为第二版,深度探讨了这一领域的核心理论和常见模式...

    《分布式系统原理与范型(第二版)》复习资料

    分布式系统原理与范型是计算机科学领域的一个重要研究方向,它涉及如何构建和管理由多个独立计算机组成的系统,这些系统能够协调工作,对外表现得就像单一的、协调一致的系统一样。在分布式系统中,透明性、开放性、...

    分布式系统原理与范型第二版课后习题答案

    分布式系统是一种由多台计算机组成的网络系统,这些计算机在用户看来就像是一个单一的系统。它们通过网络互相通信和协调工作,...通过理解分布式系统原理与范型,可以更好地设计和部署高效、可靠、可维护的分布式应用。

    分布式系统原理与范型_考试_2009_答案

    华中科技大学 分布式系统原理与范型_考试_2009_答案

    分布式系统原理与范型(第2版)

    分布式系统原理与范型(第2版)。电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍。

    分布式系统-原理与范型(第2版) 完整版

    但是,与前一版不同的是,我们没有在讨论范型的章节中完整地介绍每个案例研究,而是通过一个有代表性的案例来解释原理。这种介绍方法使得我们不仅精简了素材,而且可以使得读者在阅读和学习时更愉快些。全书结构清晰...

    分布式系统原理与范型中文版

    分布式系统原理与范型中文版 经典分布式理论书籍

    分布式系统原理与范型课件

    分布式系统原理与范型课件 课件精华内容和实验。 绝对不容错过!

    分布式系统原理与范型.pdf

    综上所述,分布式系统原理与范型这本著作深入地介绍了分布式系统的基础知识、基本原理以及设计范例,旨在帮助读者全面理解和掌握分布式系统的理论和技术。通过学习和研究这些内容,读者将能够更好地设计和实现高效、...

    分布式系统原理与范型(下).pdf

    分布式系统原理与范型(下).pdf 清华大学出版社,不错的分布式教材。

    分布式系统原理与范型 V2 (2008)

    分布式系统原理与范型是计算机科学中的一个重要领域,它研究如何构建由多个独立计算节点通过网络互相协作的系统。在2008年的第二版中,该主题可能深入探讨了分布式系统的最新发展和理论基础。这个主题对于理解和设计...

    分布式系统原理与范型第二版(中+英)

    分布式系统原理与范型 第二版 英文+中文版本 全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了一些...

    分布式系统原理与范型 第二版.zip

    分布式系统原理与范型是计算机科学中的重要领域,它涉及到多台计算机通过网络协同工作以完成共同任务的技术。第二版的书籍通常会基于第一版的经验和反馈进行改进,以提供更深入、更全面的理解。本压缩包包含的...

    设计开发 分布式系统原理与范型 第二版 完整版

    《设计开发 分布式系统原理与范型 第二版》完整版为读者提供了一个深入理解和实践分布式系统设计与开发的全面指南。本书涵盖了从基本概念到高级主题的广泛知识,旨在帮助读者掌握构建高效、可扩展、容错的分布式系统...

Global site tag (gtag.js) - Google Analytics