`

Hibernate Sync DAO封装小结

阅读更多
转一篇我在项目BLOG上写的文章。搞Hibernate Sync花了一段时间,算小结一下吧。


Hibernate Sync虽然不是很强大,但是,对于一般的简单应用来说,也是足以应付了。

最近在研究DBUnit,想把单元测试引入到咱们的数据库DAO测试中来。做了一些试验,我也对DBUnit做了一些封装,以后写基于DBUnit 的TestCase就像写Junit的单元测试那样简单:) 如果有需要的话,我可以整理一下关于数据库DAO测试的内容,给大家汇报一下:)

在做例子的过程中,我使用Hibernate Sync来生成DAO方法。为什么选用Hibernate Sync,因为它简单,并且生成的类恰好够用,并且也适合在它上面做开发,建模更加复杂的ORM映射。

好了,闲话不讲。本文的主要内容是研究Hibernate Sync DAO的设计,并通过代码示例来探讨Hibernate Sync对Hibernate的良好封装。

它的DAO继承体系如下:dao继承体系
dao可 以看到_BaseRootDAO是所有DAO的基类,_RootDAO基本上可以忽略,没有实质作用。BaseBugDAO:提供对于Bug实体的常用增 删改查操作。BugDAO主要是给我们用的,如果我们需要写其它的DAO方法,可以写在这个里头。另外,它也遵循普遍的OO原则,对于BugDAO类,也 实现了相应的BugDAO接口,在iface包下。(按照我们的代码编写规范,这样定义接口名称可是不行的。我们需要把BugDAO接口改成 IBugDAO)。

它的Entity继承体系如下:entity

可以看到,在Hibernate中,实体是比较纯粹的,就是实现了Serialize接口的对象,并不会在该实体对象中含有很多CRUD操作。我认 为这是正确的设计。回过头来,BaseBug就对应着我们的数据库,我们不用去修改BaseBug。Bug对象,我们可以增加属性和方法,可以将其改造成 有血有肉的领域对象。这个后面再说。

应该说,DAO做到这个程度基本上已经可以了。它让我们减少了编写DAO的工作量,同时在代码质量上是有保证的。在整个DAO层次中,最为核心的类 就是_BaseRootDAO。研究这个类,可以让我们更加了解Hibernate的使用方式:Configuration -> SessionFactory -> Session (ThreadLocal)
自己读代码嘛,从下往上看看_BaseRootDAO是如何封装Hibernate的。

  • java 代码
     
    1. public java.util.List findAll () {  
    2.  Session s = null;  
    3.  try {  
    4.    s = getSession(); //首先去取得Session。跟踪进去  
    5.    return findAll(s); //然后通过Session.find(×××)来实现findAll操作,这步下去是Session使用方面的东西,有兴趣自己跟踪。  
    6.   } finally {  
    7.    closeSession(s);  
    8.   }  
    9.  }  

算了,在这上 面分析代码太麻烦。如果有兴趣的话,直接跟踪代码进去看看。就知道它什么时候去创建SessionFactory,什么时候去new Configuration,然后什么时候去config,还可以看到它是怎么支持多个SessionFactory的,以及它是怎么重用Session 的,凡此总总。

在使用Hibernate Sync过程中也遇到一些问题:

1. 关于Content is not allowed in prolog问题。这个问题困扰了我2个小时,最终发现我根本就没有去配置Hibernate的配置文件的名称。具体名称当然是在 _BaseRootDAO中,有个getConfigurationFileName()方法。这个问题和我google到的答案完全是不一致的,最终还 是分析出来的。

2. _BaseRootDAO对于单个操作都是事务的,比如save,update, delete等。但是对于要批量delete,它的实现是一个一个调用单个delete。因为不是在一个事务里头,而是在N个事务里头,可能会有一些性能 上的问题。和一般的要求还不太一致:)

使用就很简答了。以BugDAO为例:List actual = new BugDAO().findAll(); //完全不用去写什么getSession方法,很简单。

分享到:
评论
1 楼 hiwzg 2007-05-30  
今天写级联删除代码的实体,实体工具出错了。因为它只能把实体选出来,然后执行delete()方法,对于内存消耗大,在执行删除过程中,tomcat出现out of memory了,可见数据占用内存是相当相当的大。

同种问题,用jdbc都不会出现内存益处的问题。在hibernate3中有批量删除,或许能减少内存的占用量,在速度上应该可以有所提升,其实按我的做法,就直接用jdbc来了。

可惜,在实体工具中不知道怎么才能访问Connection!

相关推荐

    Struts+Spring+Hibernate快速入门

    - 使用Eclipse或MyEclipse作为IDE,安装相关插件如Hibernate Sync、Spring IDE等,以便于开发和调试。 - 数据库建表,根据应用需求创建对应的表结构。 通过以上步骤,你可以构建一个简单的用户管理应用,理解SSH...

    基于4GGPRS DTU开发板的硬件图纸与软件代码全套资源,军工级电路,支持多种通信协议与数据加密,适合物联网应用 ,基于4GGPRS DTU开发板的硬件图纸与软件代码全套,军工级电路,支持多种通信协

    基于4GGPRS DTU开发板的硬件图纸与软件代码全套资源,军工级电路,支持多种通信协议与数据加密,适合物联网应用。,基于4GGPRS DTU开发板的硬件图纸与软件代码全套,军工级电路,支持多种通信协议与数据加密,适用于多种物联网应用。,资料:4g GPRS DTU 开发板软件代码硬件图纸料包括:原理图,版图,单片机代码,sim800c官方资料 不含PCB板 本公司批产产品,已无故障运行数年 全套硬件图纸和软件代码。 程序比正点原子的可靠,军工级485电路。 NBIOT和4G等采用AT指令的均可参照此代码 GPRS具有比NBIOT更低的价格更好的网络,是目前低速物联网的主要通讯技术之一。 485转GPRS GPRS支持协议: TCP UDP HTTP-GET HTTP-POST FTP Md5数据加密 心跳包 电源部分,带共模电感,防反接二极管,Tvs管,5-30Vdc转5V和4V 485部分,硬件延时电路,可靠稳定 引出网络状态(兼电源)指示灯,收发指示灯,设置状态指示灯 微动按键设置工作状态 已预留LORA模块位置,若不用可将他的Io口改做他用,能引出一路串口,2路Io口 单片机

    scala-intellij-bin-2024.1.1.zip

    scala-intellij-bin-2024.1.1.zip

    基于Android的平台书架设计实现源码.zip

    基于Android的平台书架设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。

    (源码)基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗应用_1.zip

    # 基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗应用 ## 项目简介 这是一个基于nRF5系列芯片和SoftDevice SDK的蓝牙低能耗(BLE)应用程序的示例项目。项目包含基于nRF51822和nRF52832芯片的示例代码,以及设备固件升级(DFU)相关的代码。 ## 项目的主要特性和功能 基于nRF5系列芯片项目代码适用于Nordic Semiconductor的nRF51822和nRF52832芯片,这些芯片是专为蓝牙低能耗应用设计的。 使用SoftDevice SDK项目使用了Nordic的SoftDevice SDK,这是一个高度优化的BLE堆栈,适用于nRF5系列芯片。 支持UART通信项目中的BLE应用程序通过UART接口进行通信,允许数据通过BLE连接进行发送和接收。 设备固件升级(DFU)支持项目包含用于安全设备固件升级的引导加载程序,支持固件更新的验证和存储。

    矿业生产管理数字化平台解决方案.doc

    矿业生产管理数字化平台解决方案.doc

    【ACO三维路径规划】基于matlab蚁群算法ACO无人机巡检三维路径规划【含Matlab源码 13058期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    battery 电池信息表

    kylin v10 SP1 系统下 可以查看本机电池容量放电和充电电流

    基于深度学习的movielens推荐模型新版算法源码+数据+说明文档

    【资源介绍】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,也可以作为小白实战演练和初期项目立项演示的重要参考借鉴资料。 3、本资源作为“学习资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研和多多调试实践。 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip 基于深度学习的movielens推荐模型新版算法源码+数据+说明文档.zip

    【雷达通信】基于matlab雷达系统极化对消仿真【含Matlab源码 9700期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    STM32的智能养老服务机器人系统设计.pdf

    1、以上文章可用于参考,请勿直接抄袭,学习、当作参考文献可以,主张借鉴学习 2、资源本身不含 对应项目代码,如需完整项目源码,请私信博主获取

    基于STM32的智能风扇系统设计.pdf

    1、以上文章可用于参考,请勿直接抄袭,学习、当作参考文献可以,主张借鉴学习 2、资源本身不含 对应项目代码,如需完整项目源码,请私信博主获取

    14.智能台灯(语音模式)_20240318_205506.zip

    14.智能台灯(语音模式)_20240318_205506.zip

    数字信号处理中的采样与重构理论及其应用

    数字信号处理中的采样与重构理论及其应用

    Python快速入门.zip

    python快速入门,零基础也能轻松掌握的入门指南,看着一个就够了。

    LabView与三菱全系列通讯方法详解:上位机读取方法及实践,LabView与三菱全系列通讯方法及上位机数据读取攻略,labview和三菱全系列通讯方法 labview和三菱全系列通讯办法,和上位机读

    LabView与三菱全系列通讯方法详解:上位机读取方法及实践,LabView与三菱全系列通讯方法及上位机数据读取攻略,labview和三菱全系列通讯方法 labview和三菱全系列通讯办法,和上位机读取方法。 ,LabVIEW; 三菱全系列通讯方法; 三菱全系列通讯办法; 上位机读取方法,LabVIEW与三菱全系列通讯方案及上位机读取方法详解

    基于51的多参数水质监测与报警系统设计20250304

    题目:基于51单片机的多参数水质监测与报警系统设计 主控:AT89C51 显示:LCD1602 DS18B20温度传感器 浊度传感器(PCF8591+滑动变阻器模拟) PH传感器(ADC0832+滑动变阻器) 声光报警 led*4 功能: 1.实时检测水质温度、浊度、PH 2.实时显示相关数据 3.可以通过按键修改阈值 4.各数值不在标准范围内启动声光报警 5.ph低于下限红色小灯点亮;ph高于上限绿色小灯电亮;温度低于阈值蓝色小灯电亮;浑浊度高于阈值橙色小灯电亮

    B站黑马程序员python第二章06-标识符(个人笔记)

    在B站看黑马程序员视频,整理的个人笔记

    java项目之水果系统源码.zip

    java项目之水果系统源码

Global site tag (gtag.js) - Google Analytics