基于Hibernate和Spring的持久层OR映射技术

  • 格式:pdf
  • 大小:224.54 KB
  • 文档页数:5

第29卷第4期 2006年8月 鞍山科技大学学报 Journal of Anshan University of Science and Technology Vo1.29 No.4 Aug.,2006 

基于Hibernate和 Spring的持久层 

李林红,沈文轩 OR映射技术 

(鞍山科技大学计算机科学与工程学院,辽宁鞍山 114044) 摘要:对象/关系映射(ORM)是持久层开发的热点技术。介绍一种基于Java技术的新的ORM解决方案, 

利用ORM工具Hibernate和Spring框架的整合进行持久层开发,达到快速高效,并且易于维护和扩展。引用 

一个银行系统持久层开发的实例,说明了整合应用的处理方法。 关键词:对象/关系映射;持久层;框架 中匿分类号:TP311.52文献标识码:A文章编号:1672—4410(2006)04.0371—05 

1 企业系统中的持久化方法 

在企业应用开发中,一个典型的应用架构是三层结构:表示层、业务层和持久层。其中持久层负责 

从数据库中提取和存储数据。在Java应用程序中有几种不同的持久化方式。 

1.1序列化 序列化是Java内建的持久化机制。序列化将一组对象写入一个字节流,这个字节流转而可以持久 

化到文件或数据库。其缺点是一组序列化的互相关联的对象只能作为一个整体存取,而且字节流是一 

个非结构化的格式,不利于数据的搜索操作。在当前技术下,对于企业应用,采用序列化作为持久机制 

显然是不够的。 

1.2用SOL/JDBC人工编码 现在最普遍的Java持久化方法是程序员直接使用SQL和JDBC编码,同时配合DAO设计模式进 

行持久层设计,它能够隐藏复杂的JDBC代码与SQL语句。这是一个非常好的方法,但是用人工编码 

对每个类进行持久设计的工作量非常大,在支持多个数据库引擎的情况下更是如此。而且,当需求变化 时,持久层人工编码的解决方式需要大量的精力进行维护。 

1.3实体Be.fins 

实体Bean是EJB规范中的持久数据组件。实体Bean包括BMP实体Bean和CMP实体Bean,前 者的持久状态由Bean管理,后者由容器管理。BMP的执行效率低下,CMP也不能解决对象模型与关 

系型数据库模型的不匹配:(1)实体Bean不支持继承与多态,这恰恰是面向对象的本质特征;(2)CMP 

I n与关系型数据库中的表是一一对应关系,没有充分利用Java语言中的丰富的面向对象语言类型; (3)考虑到网络间的调用效率,实体Bean不能在远程直接访问,在分布式应用中,开发者必须使用数据 

传输对象(I],r0);(4)实体Bean的复用和测试也比较困难。 

1.4对象/关系型数据库映射【ORM) 

对象/关系型数据库映射将数据的表现形式从对象模型映射到关系型数据库模型,其实质是将数据 

从一种形式转化为另一种形式,解决对象模型与关系型数据库模型在结构上的不匹配问题。ORM使 

开发者从繁杂的与持久相关的代码中解放出来,可以专注于业务逻辑,提高开发效率。开发者所要编写 

的代码量减少,增加了程序的可维护性。ORM提供性能优化的sQL代码,并且支持大部分的数据库, 

做到了与供应商无关。 

收稿日期:2004一10—1 1。 作者简介:李林红(1975一),男,黑龙江哈尔滨人。

 维普资讯 http://www.cqvip.com ・372・ 鞍山科技大学学报 第29卷 

2 Hibernate与Spring 

2.1 Hibernate简介 

Hibemate是Java环境下的一种对象/关系型数据库映射工具。Hibernate在许多方面与EJB的 

CMP/CMR以及JDO有相似之处。大多数EJB CMP/(;MR解决方案采用代码产生方式实现持久化代 

码。JD0采用字节码处理方式,而Hibernate采用运行时反射和代码生成方式,使终端用户几乎感觉不到 

它的存在。 使用Hibernate,开发人员可以按照普通的Java面向对象方法进行持久层设计,包括关联、继承、多 

态、合成以及使用Java集合框架。Hibernate的查询语言HQL是对SQL的“最小化”面向对象扩展。同 时Hibernate还支持直接SQL查询以及标准查询。Hibernate既可以工作于容器之中,也可以工作于容 

器之外。 

2.2 Spring简介 Spring是一个AOP框架和IoC容器。运用AOP可以创建“横切关注点”(Crosscutting concerns), 在应用时将它们插入代码中,使得代码有良好的可重用性。IoC容器允许在需要生成对象的地方创建 

一个应用上下文,然后将这些对象传递给它们的合作对象。只需要在配置文件中声明对象问的关系,由 

IoC容器管理这些对象,在需要时由Spring提供。使用Spring,开发者可以有效的组织中间层对象,消 

除项目中单例类的大量使用以及对大量定制文件格式使用的需要。无论是使用JDBC还是使用ORM, 

Spring提供了一个数据存取的一致性框架。 2.3 Spring对Hibernate的整合支持 在Spring中提供了对Hibernate在源的管理、DAO实现支持和事务策略的整合,可以解决许多典型 

的Hibernate整合问题。 (1)尽管Hibernate具有功能强大、灵活、免费等多种优点,它仍有一个私有的API。通常情况下, 

出于性能等原因的考虑,希望使用标准或抽象的APIs实现主要的应用功能。Spring将Hibernate的事 

务、异常等的抽象以及采用IoC方法,在不牺牲Hibernate任何性能的前提下,很容易将应用中特定的 

Hibernate代码隔离。 (2)Spring的IoC方法易于交换Hibernate会话工厂、数据源、事务管理器的实现及位置,使隔离和 

测试每条与持久化相关的代码更加简便。 

(3)Spring可以操作Hibemate会话工厂、JDBC数据源和其他相关的源,使得这些值易于管理和改 

变。Spring提供安全有效的Hibernate会话(Sesions)操作。通过使用描述性的AOP方法拦截器或显 式的模板包裹器类,Spring可方便地创建并绑定一个会话到当前的线程。 

(4)Spring可以包裹Hibernate中的异常,将它们从私有的异常转化为抽象的运行时异常,在适当 

的层中处理大部分不可恢复的持久异常,避免了繁琐的catch/throw和异常声明。 

3 一个银行系统持久层开发的应用 

某银行系统的部分系统有6个实体类:Account、Customer、Bank、Detxxsit、Transfer、Withdraw,其中 

Deposit、Transfer、Withdraw是抽象类Transaction的子类,类Customer和类Account之间存在“多对多” 的关联关系,类Bank和类Account之问具有“一对多”的组合关系,类Account和类Tran ̄ction之问存 

在“一对多”的关联关系。 

3.1用普通的JavaBean建立持久化类 

类中对每一个属性都要有public的getter方法与setter方法,方法名要符合JavaBean的规则。 

3.2编写类到关系型数据库的映射文件 

这是用Hi

bernate进行ORM的最关键的步骤,在这个文件中不仅可以进行基本的O/R映射,还可 维普资讯 http://www.cqvip.com 第4期 李林红,等:基于Hibernate和Spring的持久层OR映射技术 ・373・ 

以进行集合映射、组件映射以及继承映射等。下面是Account类的映射文件: 

<?xml version=”1.0”encoding=”gb2312”?> <!IX ̄'TYPE hibernate-mapping SYSTEM”http://hibernate.sourceforge.net/hibernate-mapping一2.0.dtd”> <hibernatc—mapping> <class nalTle ”Bank.Account”table=”account”> <!一一hibernate为我们生成主键id一一> <id nalTle=”accountNo”> <generator class ”uuid.hex”/> </id> <!一一默认把类的属性映射为相同名字的表列一一> <property nalTle=”createDate”/> <property nalTle=”balance”/> <!~一多对一的关系映射一一> <many—to-one name=”bank”cascadc ”save-update”not—null=”true”/> <!一一多对多的关系映射一一> <set naiTle ”custonlers”table ”customeraccount”> 

<key> <coluinn name=”accOuntld”not—null=”true”/> </key> <many to-ninny c1ass=”Bank.Customer”> <colUlllll name=”customerld”not—null=”true”/> </many—to-many> </set> </class> </hibernate-mapping> 3.3生成数据表 

用Hibernate包中的捆绑的SchemaExt:rort工具可以从由映射文件生成数据表,相关的语句为: Configuration∞nf:new Configuration().addClass(Bank.class). addClass(Account.class). addC1aS-S(Customer.class). addClass(Transaction.claxs); 

SchernaExtx)rt dbExport=new SchemaExport(cvonf); dbExport.setOutputFile(”bank.txt”); dbExport.create(true.|rue); 

在Hibernate中,net.sf.hibernate.cfg.Configuration的一个实例代表了应用程序中所有的Java类到 关系数据库的映射的集合。 

3.4操作持久化数据 

操作持久化数据需要获得对数据库的一个连接,使用Hibernate的会话工厂可以方便的生成一个连 接供用户使用,会话工厂是由Configuration建立的,SessionFactory se ̄ions=conf.buildSessionFactory 

(),获得一个连接后,就可以对持久对象进行create、load、update和delete以及query的操作了。 3.5在Spring应用上下文中定义源 

Spring可以解决应用对象与硬编码源的绑定,这通过将源(如JDBC数据源或Hibernate会话工厂) 

在应用上下文中定义为beans来实现。需要存取源的应用对象只通过bean关联接收对预先定义的实例 维普资讯 http://www.cqvip.com