`

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!

相关推荐

    Hibernate封装dao层

    "Hibernate封装DAO层"就是将Hibernate的功能整合到DAO设计模式中,以实现更加高效、规范的数据库操作。 1. **DAO设计模式**: DAO模式是软件设计模式的一种,它的核心思想是创建一个独立于具体数据库操作的对象,...

    JPA(hibernate) Dao 和 DaoSupport

    综上所述,`JPA(hibernate) Dao 和 DaoSupport`涉及到Java持久化技术,主要关注如何通过面向对象的方式操作数据库,以及如何设计和使用DAO层来封装数据访问逻辑。在实际项目中,我们还需要了解如何使用Spring Data ...

    hibernate封装.pdf

    在提供的代码片段中,我们可以看到一个`HibernateDao`类,它是对Hibernate的一些基本操作进行了封装,包括获取、删除等方法。下面将详细解释这些知识点。 1. **SessionFactory**: `SessionFactory`是Hibernate的...

    hibernate spring通用dao

    spring集成hibernate通用dao,泛型,server都可以调用

    HibernateDao.java

    `HibernateDao.java`是Hibernate框架中一个常见的数据访问对象(DAO,Data Access Object)类,它的主要职责是封装对数据库的操作,提供一套面向对象的接口,使得业务逻辑层可以无需关心底层SQL语句,直接通过对象...

    hibernate dao 生成工具

    Hibernate DAO(Data Access Object)生成工具是用于自动化创建数据访问层对象的实用程序,它可以显著提高开发效率,尤其是在处理大量数据库交互的项目中。DAO模式是一种设计模式,它提供了对数据库操作的抽象,使得...

    Hibernate泛型Dao

    【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...

    使用hibernate封装方法

    标题“使用Hibernate封装方法”暗示我们将讨论如何在项目中通过封装Hibernate操作,以提高代码的复用性和可读性。通常,我们会在DAO(数据访问对象)层进行这些封装,将数据库的CRUD(创建、读取、更新、删除)操作...

    类似hibernate的jdbc封装

    标题提到的"类似hibernate的jdbc封装"就是这样的一个实践,它试图在不引入庞大框架的情况下,提供类似Hibernate的便捷性。 首先,我们来了解JDBC(Java Database Connectivity),它是Java中用于连接数据库的标准...

    HibernateDao 通用

    在Java开发中,HibernateDao 通常作为一个独立的层,位于业务逻辑层(Service Layer)与持久化层(Persistence Layer)之间,用来封装对数据库的一系列CRUD(创建、读取、更新、删除)操作。 在JUMPER小组的工作...

    Hibernate通用Dao

    通用dao,简单全面,所有dao都可以继承这个dao.

    Hibernate 原生通用DAO

    **Hibernate原生通用DAO**是基于Hibernate框架设计的一种简化数据访问操作的方式,它模仿了Spring框架中的`HibernateTemplate`类,旨在提供一个简单易用的DAO(Data Access Object)层,方便开发人员进行数据库操作...

    vc生成hibernate的dao类

    标题中的“vc生成hibernate的dao类”指的是在Visual C++(vc6.0)环境下,利用特定工具或插件来自动化生成基于Hibernate框架的Data Access Object(DAO)类。DAO模式是软件设计中常用的一种模式,它将业务逻辑与数据...

    hibernate+dao实例

    通常,开发者会创建一个基类,比如HibernateDAO,提供通用的方法,然后为每个特定的数据模型创建继承自该基类的DAO实现。 在标签中,“源码”意味着讨论可能涉及到了具体的代码实现,而“工具”可能指的是Hibernate...

    Hibernate泛型DAO(结合spring模板支持)

    至于`Dao经典泛型.doc`文件,可能是更深入的关于Hibernate泛型DAO的文档,可能包含了如何配置Spring、如何处理复杂查询以及如何优化泛型DAO的更多细节。阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 ...

    hibernate通用dao

    **hibernate通用DAO(Data Access Object)**是软件开发中的一个重要概念,它主要用于数据库操作的抽象,使得业务逻辑层可以无需关注具体的SQL语句,从而实现数据访问的解耦。在Java EE应用中,Hibernate作为一款...

    Hibernate_通用DAO模式,一个写好的dao层

    在Java Web开发中,DAO(Data Access Object)模式是一种常用的设计模式,用于封装对数据库的操作,使得业务逻辑层与数据访问层分离,提高代码的可重用性和可维护性。本资源“Hibernate_通用DAO模式”提供了一种适用...

    Hibernate通用Dao设计。

    在传统的Java应用程序中,DAO(Data Access Object)层是用于封装数据库访问逻辑的地方,它隔离了业务逻辑与数据存储之间的耦合。Hibernate的出现使得我们可以将SQL语句转换为对Java对象的操作,降低了直接操作...

    HibernateDao

    hibernateDao工具类

    spring hibernate 泛型DAO

    本文将深入探讨“Spring Hibernate 泛型DAO”这一主题,以及如何通过泛型DAO实现更加高效、可复用的代码。 首先,让我们理解什么是DAO(Data Access Object)模式。DAO是一种设计模式,它的主要作用是隔离业务逻辑...

Global site tag (gtag.js) - Google Analytics