`
rainlife
  • 浏览: 235713 次
  • 性别: 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"

相关推荐

    jsf1.2+spring3.0+hibernate3.3例子-单表增删改查

    jsf1.2+spring3.0+hibernate3.3+ajax annotation集成,自定义转换器,自定义验证器,国际化,验证码等包含users表的登录增删改查操作,dao层设计抽象范型统一的父类,非常有参考价值。 欢迎交流q 38732796

    程序员简历模板09.doc

    * 负责用户管理模块和数据库操作 DAO 类 4. 技术框架 * B/S 模式 * Struts2 框架技术 * Spring 框架技术 * Hibernate 持久化框架技术 * Ajax 技术 5. 项目描述 * 南京中医药大学学生信息管理系统 * 使用三...

    java知识点汇总学习路线与笔记

    - **Action与业务逻辑类的关系**:Action类负责接收请求并调用业务逻辑类。 - **在Servlet与JSP之间传递数据**:了解如何在Servlet和JSP之间共享数据。 - **Struts处理流程**:熟悉Struts的工作流程。 - **Struts ...

    稳压罐sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    稳压罐sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    基于递推最小二乘法的永磁同步电机参数辨识及其MATLAB仿真

    内容概要:本文详细介绍了利用递推最小二乘法(RLS)进行永磁同步电机参数辨识的方法及其MATLAB仿真过程。首先解释了RLS算法的优势,如不需要概率模型、计算量适中以及适用于嵌入式系统的实时参数更新。接着展示了将电机电压方程转换为标准形式Y=φθ的具体步骤,并提供了核心的RLS迭代代码。文中还讨论了仿真过程中的一些关键技术细节,如遗忘因子的选择、协方差矩阵的初始化和更新方式、电流信号的处理方法等。最终给出了仿真结果,显示电阻和电感的辨识误差分别达到了0.08%和0.12%,并指出了实际应用中需要注意的数据同步和数值稳定性问题。 适合人群:从事电机控制研究的技术人员、研究生及以上学历的学生。 使用场景及目标:①帮助研究人员理解和掌握RLS算法在电机参数辨识中的应用;②提供详细的仿真代码和配置建议,便于快速搭建实验环境;③指导如何优化算法性能,提高参数辨识精度。 其他说明:本文不仅涵盖了理论推导,还包括了大量的实践经验分享和技术细节探讨,有助于读者全面理解RLS算法的实际应用。同时,文中提到的仿真方案可以方便地移植到DSP平台,进一步扩展了其实用价值。

    零起点Python大数据与量化交易

    零起点Python大数据与量化交易

    管道清污机器人sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    管道清污机器人sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    电路仿真:数字电路仿真.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    电能质量分析:电压暂降与中断分析.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    thai-scalable-garuda-fonts-0.6.5-1.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统thai-scalable-garuda-fonts-0.6.5-1.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf thai-scalable-garuda-fonts-0.6.5-1.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    基于ABAQUS的滑坡与沉降对埋地管道影响的有限元分析及应用

    内容概要:本文详细介绍了利用ABAQUS进行滑坡和沉降对埋地管道影响的有限元分析方法。主要内容涵盖了几何建模、材料属性定义、接触设置、边界条件与加载等方面的技术细节。通过具体的Python脚本示例展示了如何构建模型,并深入探讨了滑坡和沉降条件下管道的应力、应变分布及其潜在破坏机制。此外,还分享了一些实战经验和优化技巧,如材料模型选择、接触条件设置、边界条件处理等,强调了这些因素对结果准确性的重要影响。 适合人群:从事地下管道工程设计、施工及维护的专业技术人员,尤其是那些希望深入了解滑坡和沉降对管道影响的研究人员和技术专家。 使用场景及目标:适用于评估和预测滑坡和沉降对埋地管道造成的力学响应,帮助工程师们更好地理解和应对复杂的地质灾害环境,从而提高管道系统的安全性与稳定性。 其他说明:文中提供的Python代码片段仅为示意,具体实施时需结合ABAQUS的实际接口和项目需求进行适当调整。同时,对于大规模模型的计算,建议使用高性能计算资源以确保效率和精度。

    Java实习一天高频面试突击!最常见的几种面试题型!!!

    Java一天面试突击,迅速掌握Java常见面试题

    莲子去壳机设计模型SW10_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    莲子去壳机设计模型SW10_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    MFRC-522+RC522+RFID射频+IC卡感应模块

    MFRC-522+RC522+RFID射频+IC卡感应模块

    学术研究学术研究提示设计50招:从论文撰写到润色降重的全方位指南学术研究中常见的

    内容概要:《学术研究提示设计 50 招》是一份详尽的指南,旨在帮助研究人员提高学术写作和研究效率。该文档涵盖了从论文撰写、润色、翻译、查重降重、参考文献管理、投稿审稿到文献阅读等多个方面的具体操作指令。每一章节均针对特定任务提供了详细的步骤和注意事项,例如如何撰写标题、摘要、致谢,如何进行英文润色、中英翻译,以及如何优化逻辑结构等。文档还介绍了如何利用AI工具进行文献分析、术语表提取和研究方向探索等内容,为研究者提供了全面的支持。 适合人群:适用于学术研究人员,特别是那些需要撰写、润色和提交学术论文的研究者,包括研究生、博士生及高校教师等。 使用场景及目标:① 提供一系列具体的指令,帮助研究者高效完成论文的各个部分,如撰写标题、摘要、致谢等;② 提供润色和翻译的详细指导,确保论文语言的准确性和专业性;③ 提供查重降重的方法,确保论文的原创性;④ 提供参考文献管理和投稿审稿的指导,帮助研究者顺利发表论文;⑤ 利用AI工具进行文献分析、术语表提取和研究方向探索,提高研究效率。 阅读建议:此资源不仅提供了具体的指令和方法,更重要的是引导研究者如何思考和解决问题。因此,在学习过程中,不仅要关注具体的步骤,还要理解背后的原理和逻辑,结合实际案例进行实践和反思。

    项目optionc-20250409

    项目optionc-20250409

    2023年c语言程序设计基本概念考点归纳.doc

    2023年c语言程序设计基本概念考点归纳.doc

    电能质量仿真:谐波分析与仿真.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    基于Matlab的模拟与数字滤波器设计:IIR、FIR及经典滤波器类型的实战详解

    内容概要:本文详细介绍了使用Matlab进行模拟和数字滤波器设计的方法,涵盖了巴特沃斯、切比雪夫等多种经典滤波器类型。首先讲解了模拟滤波器的设计,如巴特沃斯滤波器的通带平坦性和切比雪夫滤波器的通带波纹特性,并提供了具体的代码示例。接着讨论了数字滤波器的设计,包括IIR滤波器的递归特性和FIR滤波器的线性相位特性,同样附有详细的代码实现。文中还特别强调了不同类型滤波器之间的转换方法以及设计过程中常见的注意事项,如频率归一化、阶数选择等。最后推荐了一些实用的Matlab工具,如fvtool和FDATool,帮助用户更直观地理解和调试滤波器设计。 适合人群:具有一定信号处理基础和技术背景的研究人员、工程师及学生。 使用场景及目标:适用于需要进行滤波器设计的实际工程应用,如通信系统、音频处理等领域。目标是让读者掌握滤波器设计的基本原理和具体实现方法,能够独立完成滤波器的设计和调试。 其他说明:文章不仅提供了理论知识,还通过大量实例代码帮助读者更好地理解和应用所学内容。建议读者在实践中多尝试不同的参数配置,以加深对滤波器特性的理解。

    饲料干燥装置sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    饲料干燥装置sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

Global site tag (gtag.js) - Google Analytics