Hibernate框架在电子商务网站中的应用研究_第1页
Hibernate框架在电子商务网站中的应用研究_第2页
Hibernate框架在电子商务网站中的应用研究_第3页
Hibernate框架在电子商务网站中的应用研究_第4页
Hibernate框架在电子商务网站中的应用研究_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、hibernate框架在电子商务网站中的应用研究 hibernate框架在电子商务网站中的应用研究摘要在如今的软件开发领域,面向对象技术、数据库技术以及组件复用技术以及被广泛应用。面向对象技术作为接机真实客观世界的开发概念,使程序代码更易读,设计更合理。软件体系架构的目的是为了实现软件复用。软件复用的思想是将软件看成是由不同功能部件组成的有机体,每一个组件可以被设计成能够完成同类工作的通用工具。一个合理的体系架构可以大大提高系统的可扩充性、可维护性,同时也便于任务的划分。另外这种稳定的体系架构还可以移植到其他的系统中。在实际的系统开发中面向对象技术与关系数据库技术是主要技术,开发人员通常把这两

2、种技术的结合应用作为首选,可是面向对象技术是基于对象的相关理论而关系数据库技术是基于关系理论尤其是代数中的集合论,理论基础的不同直接导致了两种技术的不匹配。需要一种解决不匹配的策略,于是对象关系映射(object relation mapping-orm)应运而生。hibernate是目前开发人员普遍推崇的orm工具,这是一个基于java开放源代码的orm框架,对jdbc进行了轻量级的对象封装,使java程序员可以随心所欲的使用面向对象编程思维来思维操纵数据库。本文介绍了面向对象技术和关系数据库技术的基础,介绍了通常的数据访问模式,介绍了目前比较流行的orm中间件,然后详细阐述了hiberna

3、te框架的体系结构和基本原理,最后通过应用struts和hibernate框架技术开发网上购物系统,研究和分析了hibernate技术在实际开发中的应用。关键词:对象关系映射;orm;hibernate;mvc;j2eethe reserch and application of eletronic commerece website based on struts frameworkabstractnowadays in the software development field, object-oriented technology, database technology and co

4、mponent technology are already widely used。object-oriented technology as the development concept of closing to real objective world, the code more readable, design more reasonable 。thinking of software reuse is to consider software as a complex of different components, and each of components can be

5、designed as a common tool to realize the similar function. a rational framework can improve expansion, maintainability and easiness of task partition, object-oriented technology and database technology play an important part in many systems, and developers are keen on the union of them. object-orien

6、ted technology is based on theories of object, but relation database technology is based on theories of relation especially theories of set. diversity of base theory has led to mismatch of the two technologies. therefore a strategy to resolve mismatch is required urgently, and the object relation ma

7、pping arises at the same time. the mapping of object and relation is a kind of job of consuming time. hibernate is the orm tool which is generally regarded by many programmer at present. it is the orm tool of an opening source java code. it carries on the object encapsulations of lightweight to jdbc

8、. it makes java programmer handle the database freely by using object-oriented programming thinking.the usual mode of data access, the object-oriented technology and relational database technology based, the popular orm middleware, all those are introduce in this article .and then introduce the arch

9、itecture and basic principles of hibernate framework .and then through the application of struts and hibernate framework technology develope the online shopping systems.research and analysis the application of hibernate technology in the practice developmentkey words:orm; hibernate; mvc; j2ee53目录1绪论

10、11.1研究背景11.2研究现状12.对象持久化的论述32.1面向对象技术和关系数据库技术的基本理论32.1.1面向对象技术的基本理论32.1.2 关系数据库的基本理论32.2 数据访问模式42.2.1 业务逻辑与数据逻辑耦合模式42.2.2 主动域对象模式42.2.3 orm模式42.3 持久层的概念52.4 常用的持久层中间件62.5 本章小结73 hibernate实现对象持久化的原理83.1 hibernate的运行机制93.2 hibernate映射策略113.2.1 实体映射的策略113.2.2实体关联关系映射的策略143.3 hibernate的缓存性能优化163.3.1 持久层

11、的缓存技术163.3.2持久层的缓存范围163.3.3 hibernate的二级缓存183.4 本章小结:204.网上数码港系统的实现214.1网站的需求分析214.2网站的开发环境和开发技术214.3 网站的总体设计214.3.1模块设计214.3.2 数据库设计254.3.3 系统架构设计264.4 基于hibernate的网站持久层的设计274.5 网上数码港网站购物模块的实现314.6本章小结335总结和展望34参考文献35致谢36附录a:购物模块持久层的hibernate实现代码371绪论1.1研究背景在如今的企业级应用开发环境中,面向对象的开发方式已成为主流。作为接近真实客观世界的

12、开发概念,面向对象使程序代码更易读、设计更合理。一方面,面向对象技术的理想存储机制一面向对象数据库还不成熟;另一方面,关系数据库是目前使用最广泛的数据库,因此,在开发过程中通常会采用面向对象的应用和关系数据库相结合的方式。面向对象技术和关系数据理论基于不同的理论基础,前者基于耦合、内聚和封装等软件工程概念,后者基于数学理论,特别是集合论,使得二者在协同工作时出现不匹配现象。例如:关系模型没有现成的表达对象继承的概念;如果查询完全用sql编写,则无法明确它们与对象的关系;关系模型支持的数据类型过于简单,如整型,实型,等等,不能描述事物的复杂属性。通过直接内嵌sql或者数据访问类的方法可以解决面向

13、对象技术和关系数据库不匹配的问题。前者是通过直接在类的源代码中嵌入sql语句来实现对象到关系数据库的映射和存储,这种方法比较简单,易于实现。但是它造成了应用程序和数据库结构的直接耦合,违反了软件工程的原则。后者是把所有的sql语句封装起来,封装在一个或多个“数据处理类”中,较之第一种方法有所改进,仍然没有完全消除应用程序和关系数据库的耦合。一个更好的解决方案是在应用程序的业务逻辑层和数据库层之间构建一个持久层,由持久层来提供对象一关系映射服务,封装数据访问细节。采用持久层的方法可以从根本上消除应用程序和关系数据库的耦合,使得数据访问对于应用程序的源代码是透明的,如果数据库的库表结构发生改动,只

14、需要对持久层的配置文件做适当修改,不会对应用程序造成影响。1.2研究现状在软件系统开发过程中,数据和过程几乎都是不可或缺的基本要素。数据是静态的因素,而过程是动态的因素,是对数据的处理流程。在传统的系统开发方法中,由于过程与数据的分离,随着专门针对过程处理的高级程序设计语言的出现,相应地也出现了专门针对数据持久的文件系统和数据库管理系统等技术。但是随着数据和过程在细粒度上紧耦合成对象,那么最理想的状态就是把专门针对过程处理的高级程序设计语言和专门针对数据持久的数据库管理系统技术在细粒度上也耦合起来,从而发展出一种新的具有持久化功能的对象。无疑这一意义上的对象具备了对象持久的先天优势,但这势必要

15、求抛弃旧有技术而发展出一种新的对象技术,而这又是人们的思想一时不能接受的。因而现阶段在实现对象持久化上并没有采用这种彻底的面向对象技术,而是保留了现有数据持久化技术,以通过保留对象状态再还原的方式来变相实现对象持久化。目前软件系统通常采用了多种不同机制来实现对象持久存储,而这些机制中又以支持事务处理、技术相对成熟的关系数据库存储机制尤为普遍。在j2ee平台下,提供了多种数据持久化的实现机制,如jdbc,ejb,hibernate等。这些技术在整个市场中都占有一定的份额。jdbc是java数据访问最原始、最直接、效率最高的方法,在目前许多中小型项目中仍然采用这种方式。ejb曾经是j2ee领域的核

16、心,目前也有许多项目是基于ejb的。但是实现起来的复杂性往往使人望而却步。hibernate是近年来数据持久化的热门技术,它有效地解决了对象和关系之间的阻抗不匹配问题,通过底层封装了数据持久的代码,为开发人员提供了真正的面向对象的开发方法。在数据访问处理方面,目前业界比较惯用的有三种模式业务逻辑与数据访问细节耦合的模式、基于主动域对象的模式、基于对象关系映射的模式。这三种模式的区别主要在于数据访问细节的封装上。基于对象关系映射的模式是目前数据访问处理方面比较新颖的模式,也是越来越受青睐的模式。在多层体系结构的数据层的设计上,为了获取较高的稳定性、较好的可扩充性,开发人员常常会借用设计模式这把利

17、器来获得较好的设计效果。软件的分层体系结构已由最初的两层结构发展到了三层甚至四层或更多层结构,层次结构的划分,使系统的易开发性,可维护性,可移植性,可扩展性,都得到了很大的提升。2.对象持久化的论述2.1面向对象技术和关系数据库技术的基本理论2.1.1面向对象技术的基本理论面向对象技术代表了一种全新的程序设计思路和观察、表述、处理问题的方法,与传统的面向过程的开发方法不同,它力求符合人们日常自然的思维习惯,降低、分解问题的复杂性,提高整个求解过程的可控性、可监测性和可维护性,从而达到以较小的代价和较高的效率获得较满意效果的目的。面向对象技术最初是从面向对象的程序设计开始的,随着面向对象程序设计

18、语言的发展,产生了面向对象的软件工程学,面向对象的开发已成为当今软件开发的主流方法。面向对象数据模型是由类来构成的层次结构,层次结构是指类与类之间的继承关系。面向对象的数据模型是用面向对象的观点来描述现实世界实体的逻辑组织、对象间限制、联系等的模型。它将现实世界的所有实体都作为对象来处理,对象的属性表示了对象的状态和特征,而对象的操作表示了对象的行为方式。操作包括接口说明和实现两部分,接口说明声明了该操作的名称、参数列表、返回类型等实现是通过某种具体语言编写的代码完成具体操作。外界只能通过消息与对象进行通信,消息按照对象中的方法说明规定的形式传给对象,对象接收此消息后调用相应的操作,操作完成后

19、再以消息的形式返回操作结果。面向对象的数据模型能方便自然地模拟现实世界,对象内部数据及方法实现方式的变化不影响对象外界的使用,提高了数据的独立性。方法的访问与实现部分分离有利于保证数据的完整性和安全性,外界不能直接访问修改对象内部数据。2.1.2 关系数据库的基本理论关系是基于数学原理,特别是基于集合论的原理。关系模型是目前数据库系统中应用最为广泛的数据模型。相对于网状模型和层次模型,关系模型有其自身的优势,关系模型有严格的数学基础、概念简单清晰、非过程化程度高、数据具有独立性、更有利于数据管理和数据检索。关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。关系模型的数据结构非常单

20、一,现实世界的实体以及实体之间的各种联系均用关系来表示。关系模式是关系的描述,关系是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。在用户看来,关系模型中数据的逻辑结构就是一张二维表。2.2 数据访问模式目前大多数的应用系统采用数据库作为数据存储的工具,而数据的处理则是通过应用程序来实现的。该部分数据访问模式的研究是基于关系数据库的。根据数据访问在程序中所处的位置,可以将数据访问模式分为三种:业务逻辑与数据访问耦合模式,主动域对象模式,对象关系映射模式。2.2.1 业务逻辑与数据逻辑耦合模式由于业务逻辑和数据

21、访问逻辑的代码都写在一个类中,因此这种模式称为业务逻辑与数据逻辑耦合模式。这种模式的优点是直接、访问效率高。在多层体系结构中,层次与效率是不可兼得的两方面,层次越多效率越低。由于这种方式直接跟数据库打交道,避免了中间的访问环节,因此效率上是比较高的。缺点是可维护性差、可重用性差。业务逻辑与数据访问逻辑代码混合在一起,一是使得程序的可读性差、维护起来困难,二是存在大量的重复代码而无法重用。2.2.2 主动域对象模式在该模式中,数据访问的细节位于实体域对象中。在实现中封装了关系数据模型和数据的访问细节,由实体域对象负责自身的数据访问细节,这种实体域对象也被称为主动域对象。过程域对象只包含业务逻辑,

22、通过对主动域的引用完成数据访问操作。这种模式的优点是解耦应用程序代码和数据模型、可维护性较好。由于过程域对象中只有业务处理逻辑代码,而没有包含任何的数据访问代码,关于数据模型的操作是由主动域自身完成的,因此数据模型的改变不会影响到业务逻辑。缺点是数据访问分布在多个域对象中,限制了应用程序对数据访问的控制。每个主动域对象都负责数据访问实现,这就意味着采用全局性的数据访问策略需要在每个主动域对象中重复相似的代码。2.2.3 orm模式在这种模式中,数据访问细节被封装在一个被称为持久层的层次中,而实体域对象只包含业务数据,过程域对象只包含业务逻辑。在这种模式中实现数据的访问需要借助第三方的对象关系映

23、射工具来完成。这种模式的优点是应用程序代码清晰,与包含数据模型和数据访问细节的代码相比,单纯处理域对象的应用程序代码更加清晰,也更容易开发和维护。对象关系映射机制隔离了可配置的映射元数据,可以在不影响应用程序代码的情况下修改元数据。许多对象关系映射产品在运行时保存和解释映射元数据,元数据的变化不需要重新编译任何代码。缺点是限制了应用程序对数据访问的控制,应用程序只能通过持久化管理类来调用定义的接口,难以调整物理数据库操作和资源管理以优化特定应用程序的数据访问功能。orm中间件能在任何一个java应用的业务逻辑层和数据库层之间充当桥梁(参见图2-1).图2-1 orm充当业务逻辑层和数据库层之间

24、的桥梁2.3 持久层的概念什么是持久层呢?在定义持久层之前,我们先来了解下“持久”的含义。这里的持久是保持很久的意思。具体点就是:把应用程序中的对象的属性和状态保存到数据库或文件系统中,让对象的属性和状态在对象的生命周期结束后任然可以保持很久,以便将来可以根据数据库中的数据来恢复对象,再次使用。而持久层就是实现对象持久化的一个逻辑层次。这个层次的程序代码专门负责实现对象持久化的功能,所以的对象持久化代码都在这个层次实现,这个层次的程序代码出来对象持久化的功能之外没有其他功能。现在的软件架构一般都分为三个层次:表示层,业务逻辑层,数据逻辑层(即持久层)。就像前面所说的三种数据访问模式,第一种是把

25、业务逻辑代码和数据访问逻辑代码混合在一起,根本不能分出数据访问的层次来。所以这种模式虽然有持久功能,但却没有形成持久层。第二中主动域模式把业务逻辑和数据访问逻辑初步分开来了,初步形成了持久层,就是主动域层。第三种orm映射模式形成了比较完善的持久层,这个持久层通常叫数据访问对象层。采用持久层的方法(如图2-2)可以从根本上消除应用程序和关系数据库的耦合。它使得数据对于应用程序的源代码是透明的,如果修改数据库的库表结构,不会对应用程序造成影响,也不用改动持久层的代码。它还有一个优点就是将程序员从sql语言中解放出来,程序员无需了解数据库的结构。这种方法适合用于大规模的工程项目,因为它可维护性高,

26、可移植性好。其缺点是对应用系统的性能上有所影响。如果持久层设计的比较合理,这种影响会很小。图2-2 持久层的使用2.4 常用的持久层中间件当一个软件架构有清晰的持久层时,他的可维护性,可扩展性,可移植性都大大增强。又由于现在软件编程中面向对象技术和关系型数据库的广泛应用,具有orm能力的持久层就变得非常实用,对于企业应用的系统开发人员,花费大量的时间自行开发持久层不是很可行。目前,在持久层领域,已经出现了许多持久化中间件可以帮助人们完成持久层的开发工作,用户可以根据自己的需求进行选择,并进行二次开发。这里介绍常用的持久化中间件。 1. toplinktoplink是一个较早期的持久化中间件产品

27、,最初面向c+,后来实现了java的映射。toplink性能优异,功能强大,并且提供了独特的查询过滤器机制,对关系的处理和查询都非常有效,于是,toplink逐渐从商用。o/r mapping产品中胜出,成为市场上的最出色的映射产品。toplink虽然强大,但它价格高昂,让很多用户望而却步。 2. castor castor是exolab组织开发的面向java的持久化工具,它最大的特色就是实现了大部分的odmg oql规范,在查询上,可以像使用对象数据库一样对类图进行查询。它的原理是通过java反射api去实现属性的设置和读取。不过由于各种原因,castor后来的版本更新越来越慢,至今未出到1

28、.0正式版。3. apache torqueapache torque是一个使用关系数据库作为存储手段的java应用程序持久化工具,是apache的公开源代码项目。torque是一个开源项目,由web应用程序框架jakarta apache turbine发展而来,但现在已完全独立于turbine. torque主要包含两部分:一部分是generator,它可以产生应用程序需要的所有数据库资源,包括sql和java文件;另外一部分是runtime,提供使用这些代码访问数据库的运行环境。目前torque支持的数据库包括db2, sql server, oracle, postgresql等。 4

29、. jaxorjaxor是一个简单但功能强大的创建关系映像层的工具。jaxor允许开发者轻松地在表中插入、更新、删除行,但也可被扩展为创建一个可扩展的映像层,这个层可创建一个完全的域模型,透明地映射到数据库表。 5. hibernatehibernate是一个基于java的开放源代码的持久化中间件,采用java反射api来持久化java对象。hibernate不需要任何容器,提供简单易用并符合odmg3-st贝e的api。作为一个良好的orm中间件,它有如下特点:(1)透明地提供对象与关系数据库的映射,以统一的接口方式支持多种数据库。(2)缓存机制,复杂的缓存机制和锁定策略,使针对数据库操作大

30、大减少。(3)开源免费的license,可以在需要的时候研究源代码,改写源代码,进行功能的定制。(4)轻量级封装,避免引入过多复杂的问题,容易调试,减轻程序员的负担。(5)具有可扩展性,api开放,当自身功能不够用的时候,可以自行编码扩展。(6)开发者活跃,产品有稳定的发展保障。 6. ibatis使用ibatis提供的orm机制,对业务逻辑实现人员而言,面对的是纯粹的java对象,这一层与通过hibernate实现orm而言基本一致,而对于具体的数据操作,hibernate会自动生成sql语句,而ibatis则要求开发者编写具体的sql语句。相对hibernate等“全自动”orm机制而言,

31、ibatis以sql开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。作为“全自动”orm实现的一种有益补充,ibatis的出现显得别具意义。此外还有speedo,xorm,cayenne等,在这里就不介绍了。2.5 本章小结本章通过介绍面向对象技术和关系数据库技术的基本理论,软件架构中持久层的应用,引导到持久层的orm的应用,并且介绍了多种常用的持久层中间件,为详细了解下一章的hibernate框架做好准备。3 hibernate实现对象持久化的原理hibernatehibernate2hibernate3相关工具实际应用理论思想tanghan eclipse plugin

32、jertroller weblogger众多金融/erp等应用terac board/miracle每月下载量200万,几乎是事实上的orm标准实现andromdamiddlegenxdoclet hibernate tagshibernate consolehibernate synchronizer一个类跨越多个表支持手写sql属性延迟加载映射到xml文档jmx支持通过query大批量更新/删除虚拟条件脱离session的criterriaapi更灵活的类与表的映射关系,几乎没有限制一张表容纳多个类、每个表一个类的映射选择一对多、多对多关联集合的透明映射直接sql查询组件(componen

33、t)的支持两级缓存自动主键管理持久层概念orm资源管理模式设计模式具体版本图3-1 hibernate的体系结构图3.1 hibernate的运行机制hibernate是一个基于java的开放源代码的持久化中间件,它对jdbc做了轻量级封装,不仅提供orm映射功能,还提供数据缓存和数据查询功能,java开发人员可以方便的通过hibernate api来操纵数据库。图3-2阐述了hibernate的运行机制图3-2 hibernate的运行机制hibernate从其配置文件中读取和数据库连接有关的信息,这个配置文件应该位于应用的classpath中。hibernate的配置文件有两种形式:一种是

34、xml格式的文件(hibernate.cfg.xml );还有一种是java属性文件(hibernate. properties),采用“健二值”的形式。hibernate的基础代码包括持久化类和hibernate映射文件以及ddl。持久化类是指其实例需要被hibernate持久化到数据库中的类。持久化类通常都是域模型中的实体域类。持久化类符合javabean的规范,包含一些属性,以及与之对应的getxxx()和setxxx()方法。hibeinate采用xml格式的映射文件来指定对象和关系数据库之间的映射(默认为.hbm.xml后缀)。该文件描述了如何把类映射到数据库具体的表中,并述了类与其

35、他类的关系。在运行时,hibernate将根据它生成各种sql语句。ddl即数据库定义文件。hibernate对于这三种文件的生成具有强大的灵活性,只要知道任何一种文件,都可以通过hibernate提供的代码自动生成工具得到另外两种文件。如:1)只有映射文件:mapping file -hbm2java-java-schema export- ddl2)只有ddl: ddl-middlegen-hbm- hbm2java-java3)只有java: java-xdoclet-hbm- schema export - ddl如上图所示,如果事先设计好了ddl,就可以利用middlegen自动生成

36、*.hbm.xml文件。如果先完成了映射文件,就可以先实例化configuration类,然后利用addclass()映射*.hbm.xml。再在a处调用configuration. getproperties,检查所使用的数据库,表的关联性,外键约束性,和一对多关系的设置。最后在b处利用schemaexport类在数据库中创建相应的表结构。在图中还可以看到hibernate的初始化过程,包括如下步骤:1)创建一个configuration类的实例: configuration config = new configuration();该方法会调用environment类的getpropert

37、ies方法,从而把默认文件路径下的perties(或hibernate.cfg.xml )配置文件中的配置信息读入到内存。 2)调用configuration类的addclass()方法: config.addclass(class persistentclass);该方法把默认文件路径下的persistentclass映射文件中的映射信息读入到内存中 3)如c处所示,调用configuration类的buildsessionfactory()方法:sessionfactory = config.buildsessionfactory();该方法使用数据库的jdbc的

38、驱动连接数据库,查看所用数据库连接池,同时检验jndi等的配置情况,最后创建一个sessionfactory实例,并把configuration对象包含的所有配置信息拷贝到sessionfactory对象的缓存中。由于java语言是纯面向对象的语言,因此不可能像c语言那样直接操纵内存例如声明一段可用的内存空间。这里的缓存其实指的是java对象的属性(通常是一些集合类型的属性)占用的内存空间。例如,sessionfactory的实现类中定义了许多集合类型的属性,这些属性用于存放hibernate配置信息、映射元数据信息等。hibernate在初始化阶段,会根据映射文件的映射信息,为所有的持久化类

39、预定义以下sql语句:1) insert语句:insert into表名(字段1,字段2,)values(?,?,.)2) update语句:update表名set字段1=?,字段2=?,where id=?3) delete语句:delete from表名where id=?4)根据oid来检索持久化类实例的select语句:select字段1,字段2,.from表名where id=?以上sql语句中的问号代表jdbc preparedstatement中的参数。这些sql语句都存放在sessionfactory的缓存中,当执行session的save(), update(),delete

40、q, load()方法时,将从缓存中找到相应的预定义sql语句,再把具体的参数值绑定到该sql语句中。初始化过程结束后,调用sessionfactory实例的opensession()方法来获得session实例,然后通过它执行访问数据库的操作。session接口提供了操纵数据库的各种方法,如:1) save()方法:把java对象保存数据库中。2) update()方法:更新数据库中的java对象。3) delete()方法:把java对象从数据库中删除。4) load()方法:从数据库中加载java对象。5) createquery()方法:从数据库中查询java对象。session是一个

41、轻量级对象。通常将每一个session实例和一个数据库事务绑定,也就是说,每执行一个数据库事务,都要先创建一个新的session实例。如果事务执行中出现异常,应该撤销事务。不论事务执行成功与否,最后都调用session的close()方法,从而释放session实例占用的资源。至此,已对hibernate的运行机制有了大概的了解,下面将具体分析hibernate如何实现对象关系映射orm。3.2 hibernate映射策略 o/r映射技术是orm中间件中最为关键的组成部分,也是开发过程中必须时刻关注的内容。下面,讨论hibernate中o/r映射技术的实现策略。3.2.1 实体映射的策略实体映

42、射技术作为类与表之间的联系纽带,在orm实现中起着至关重要的作用。hibernate中,实体映射主要包括以下3部分内容:1.类一表映射在简单的情况下,一个类映射成一张表。所谓简单情况,就是说这个类不与其它的类存在继承关系。在这里主要讨论如何在关系数据库中实现类的继承。继承关系是关系型数据与面向对象数据结构之间的主要差异之一。如何在关系型数据库基础之上,通过继承关系得到清晰合理的层次划分是hibernate实体层次设计中的一个关键问题。hibernate中支持3种类型的继承形式:1)继承关系树的根类对应一个表(table-per-class-hierarchy):如图3-3所示,父类和所有的子类

43、公用一个表,该表需要有一个简单列充当类型判断的角色。用类型鉴别器(discriminator)来判断表中的每条记录是什么类型,映射成对应的子类。优点:查询简单。缺点:多个子类公用一个表,造成表结构复杂,且很多字段置空。图3-3 table-per-class-hierarchy2)继承关系树的每个具体类对应一个表(table-per-subclass ):如图3-4所示,在具体类对应的表中,不仅包含和具体类的属性对应的字段,还包含和具体类的父类的属性对应的字段。即父类的公共属性出现在每一个子类表中。需要注意的是,实现时在每个子类的xml文件中都要映射从父类继承的关联关系。优点:没有数据冗余:如

44、果只是查询某个子类,那么是简单且高效的。缺点:不能很好的支持多态关联,每个子类都是独立的,查询所有内容时,要分别从各个子类表中查询,然后将查询结果合并到一起,这对性能有坏的影响。图3-4 table-per-subclass3)继承关系树的每个类对应一个表(table-per-concret-class ):如图3-5所示,在关系数据模型中用外键参照关系来表示继承关系。首先为公用字段创建一个表,每个subclass特有的属性分别创建一个表。这样一个完整的subclass就是公用表+子类表。优点:最符合面向对象的概念;类映射到数据库中的表的创建工作是所有实现中最简单的,表中只需包含自己的所有属性

45、即可;对多态的支持最好,对于对象所可能充当的角色仅需要在相应的表中保存记录;父类和子类之间的耦合度大大降低,易于修改父类和增加新的类。数据库的空间被有效利用,不存在大量的数据冗余。缺点:每次取一个对象都要通过关联查询进行,性能较差。图3-5 table-per-concret-class 如果不需要支持多态查询和多态关联,可以采用“table-per-subclass”的映射方式,如果需要支持多态查询和多态关联,并且子类包含的属性不多,可以采用“table-per-class-hierarchy”的映射方式,如果需要支持多态查询和多态关联,并且子类包含的属性很多,可以采用“table-per-

46、concret-class”的映射方式。如果继承关系树中包含接口,可以把它当作抽象类来处理。2.映射oidjava语言按内存地址来标识或区别同一个类的不同对象,而关系数据库按主键值来标识或区别同一个表的不同记录。hibernate使用oid来统一两者之间的矛盾,oid是关系数据库中的主键(通常为代理主键)在java对象模型中的等价物。在运行时,hibernate根据oid来维持java对象和数据库表中记录的对应关系。为了保证持久化对象的oid的唯一性和不可变性,通常由hibernate或底层数据库来给oid赋值。因此,可以把oid的setid()方法设为private类型,以禁止java应用程

47、序随便修改oid。而把getid()方法设为public类型,这使得java应用程序可以读取持久化对象的oid。hibernate提供了标识符生成器接口identitygenerator接口,并且提供了多种内置的实现,例如:increment, identity, sequence等。3.属性一字段映射属性一字段映射将映射类属性与库表字段相关联。下面将类属性分成三种情况进行讨论。 1)属性类型可以直接映射到某个hibernate映射类型: 只要在xml文件中指定pojo的属性名、库表字段名以及数据类型,hibernate就可以透明地实现对应的映射。 2)属性是java集合类型: 按照集合的数据

48、结构划分,java集合可分为三类:set, list和map o hibernate允许把以上三种java集合都映射到数据库中,在映射文件中,与映射java集合相关的元素包括, , 和。需要指出的是在java集合api中并没有提供bag接口,hibernate允许在持久化类中用list来模拟bag的行为。对于每一种集合接口,hibernate都提供了内置的实现类,这些实现类都在collection包里。当session从数据库中加载java集合时,会创建内置集合类的实例。3)属性本身也是一个类:hibernate在映射类属性时区别对待值类型类和实体类型类。值类型和实体类型的最重要的区别是前者没

49、有oid,不能被单独持久化,它的生命周期依赖于所属的持久化类的对象的生命周期;而实体类型有oid,可以被单独持久化。如果属性类是值类型,即聚集(组成)关系映射。在创建映射文件时,不能使用元素来映射属性,而要使用元素。如:a的某属性b是值类型的类,则a在数据库中对应的表的字段会包含b的所有属性,b的属性直接映射到a的映射表的相应字段。 如果属性类是实体类型的,即多对一关联关系的映射,下面会有详细介绍。3.2.2实体关联关系映射的策略 在前面的内容中,讨论了基于hibernate的实体映射技术的基础知识。对于orm而言,另外一个非常关键的特性,就是对实体之间关联关系的管理。下面就一对一、一对多以及

50、多对多的关联关系分别进行讨论。 1.一对一关联 hibernate提供了两种映射一对一关联关系的方法:按主键映射和按外键映射。1)按主键映射:这种映射方式就是两张关联表通过共享主键形成一对一映射关系。只需为一张表设定主键生成器,而另一张表的主键与之共享相同的主键值。hibernate通过。ne-to-one节点进行声明。但如果某两个类之间有多个一对一关联,这种方法就不适用了,此时可以采用按外键映射的方法。 2)按外键映射:这种映射方式就是将一张表的主键作为另一张表的外键。hibernate通过many-to-one节点进行声明。因为唯一外键关联的一对一关系只是多对一关系的一个特例。2.一对多关

51、联一对多关联在系统实现中非常常见。一对多关系分为单向一对多关系和双向一对多关系。单向一对多关系只需在“一”方进行配置,双向一对多关系需要在关联双方均加以配置。对于单向一对多关联关系,hibernate提供了集合属性的映射支持。实现相对比较简单。但是存在一个问题,由于是单向关联,为了保持关联关系,只能通过主控方对被动方进行级联更新。如果被关联方的关联字段为“not null”,当hibernate创建或者更新关联关系时,可能出现约束违例。此外,由于hibernate实现机制中,采用了两条sql语句进行一次数据插入操作,相对单条insert操作,几乎是双倍的性能开销,效率较低,因此,对于性能敏感的

52、系统而言,这样的解决方案所带来的开销可能难以承受。双向一对多关联的出现则解决了上面单向关联的问题。它除了避免约束违例和提高性能的好处之外,还带来另外一个优点,由于建立了双向关联,可以在关联双方中任意一方,访问关联的另一方,这提供了更丰富灵活的控制手段。双向一对多关联,实际上是“一对多”与“多对一”关联的组合。也就是说必须在主控方配置单向一对多的基础上。在被控制方配置与其对应的多对一关系。需要注意的是,此时hibernate通过把集合元素的inverse设置为true,将关联关系的维护工作交给“多方”,而“一方”的关联只是“多方”的镜像。hibernate仅按照“多方”的对象状态的变化来同步数据

53、库更新。3.多对多关联hibernate关联关系中相对比较特殊的就是多对多关联。多对多关联与一对一和一对多关联不同,他需要借助中间表完成多对多映射信息的保存。关联表包含关系中涉及到多张表的主键,也就是每个表中某个对象的oid,每条记录即这些oid的组合,表示哪些对象之间是存在关系。通过将这些表的主键关联起来,实现两个或者多个表之间的多对多关系。关联表的实现有两种方法:一种是关联表的属性包含关系中涉及表的主键,并且关联表的主键是这些属性的组合:第二种方法是将关联表视为普通表,使用自己的主键,然后通过将属性设置成外键和别的表关联起来。3.3 hibernate的缓存性能优化缓存是提升系统性能的关键

54、因素。它的主要作用是减少1/o和计算,提高系统性能,通过缓存查询结果来提高数据库系统的整体性能在数据库领域得到了广泛应用。相对于内存操作而言,数据库调用是一个代价高昂的过程,对于典型企业级应用结构:数据库往往与应用服务器位于不同的物理服务器,这也就意味着每次数据库访问都是一次远程调用,socket的创建与销毁,数据的打包拆包,数据库执行查询指令、网络传输上的延时,这些消耗都给系统整体性能造成了严重影响。此时,缓存的存在价值就凸显出来了。特别是对于查询操作繁复的系统而言,良好的缓存管理机制以及合理的缓存应用模式往往是性能提升的关键。缓存技术从应用结构上可以划分为三类:数据库服务器的缓存、客户端的

55、缓存技术、中间层的缓存。在数据库应用系统中这三类技术是可以结合使用的。关于数据库服务器的缓存和客户端的缓存在这里就不进行介绍了,这里主要介绍下中间层的缓存机制。3.3.1 持久层的缓存技术上个世纪九十年代出现的三层结构克服了两层结构的局限性,将应用的表现逻辑、业务逻辑和数据处理相互分离。第三层位于客户端和服务器方数据管理组件之间,负责管理执行业务逻辑,又称为中间层或应用服务器。相对于两层结构而言,三层结构既保留了原来c/s模式的优点,又提高了应用的可维护性、可扩展性和可重用性。但是三层结构中将数据管理与应用逻辑相分离又造成了用户访问数据的性能下降,妨碍了系统的可伸缩性。因此人们提出了在三层结构

56、的中间层缓存数据的优化方案。它跟客户端缓存有一定的相似性,但是由于中间层的缓存数据可以由多个客户共享访问,缓存数据重用和访问缓存冲突的机会更大。因此中间层的缓存技术跟客户端的缓存技术有一定的区别。3.3.2持久层的缓存范围持久层的缓存一般都是作为应用服务器的组件存在。其工作过程如下:客户端向应用服务器提出查询请求;应用服务器将查询请求提交给持久层缓存处理。如果持久层缓存能够满足查询,则它从缓存中提取查询结果并返回给客户端。否则,持久层缓存将查询或通过分析变换查询生成的子查询交给数据库服务器处理。在接收到查询请求之后,数据库服务器将查询结果返回给持久层缓存。如果数据库服务器处理的是子查询,持久层

57、缓存将本地查询结果和数据库服务器的返回结果合并,得到最终结果。持久层缓存通过应用服务器将最终查询结果返回客户端。持久层的缓存范围决定了缓存的生命周期以及可以被谁访问。缓存的范围可以分为三类:1.事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束了生命周期。缓存的物理介质为内存。每个事务都有独自的缓存,缓存内的数据通常采用相互关联的对象形式。在同一事务的缓存中,持久化类的每个对象具有唯一的oid。2.进程范围:缓存被进程范围内的所有事务共享。这些事务有可能并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期,当进程结束,缓存也就结束生命周期。进程范围内的缓存可能会存放大量数据,它的物理介质可以是内存或硬盘。缓存内的数据既可以采用相互关联的对象形式,也可以采用对象的散装数据形式。对象的散装数据类似于对象的序列化数据,但是把对象分解为散装数据的算法通常较之对象的序列化算法更快。在进程范围的缓存中,如果数据按照相互关联的对象形式存放,那么持久化类的每个对象都具有唯一的oid。这种数据存放形式的优点是节省内存。但是在并发环境中,当执行不同事务的各个线程同时长时间操纵同一个对象时,必须对这些线程进行同步,而同步会影响并发性能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论