来源:中国一卡通网 作者:周化峰 张明扬 虞闯 杨雨彤 发布时间:2008-02-25 15:14:27 字体:[大 中 小]
摘 要:主要论述运用基于O/R(Object/Relational对象/关系)映射技术的hibernate框架来设计一卡通系统中持久层,从持久层的设计到实现都做了具体的说明.先介绍一卡通系统持久层的整体架构,再从具体类之间的关系对持久层做了详细的设计,最后通过一卡通持久层的实现来完成从理论到实践、从设计到实际应用的过程.
计算机应用软件发展到现在由单层体系结构发展为多层体系结构,而三层结构是目前典型的一种应用软件结构.它包括表述层:提供与用户的交互界面;业务逻辑层:实现多个业务逻辑;数据库层:负责存放和管理应用的持久性业务数据.而hibernate是连接java应用程序的关系数据库的中间件 J,在分层软件架构中它位于持久层,封装了所有数据访问细节,使业务逻辑层可以专注于业务逻辑.
1 一卡通系统持久层的设计
一卡通系统是基于J2EE(Java 2 Enterprise E-dition建立在Java 2平台上的企业级应用的解决方案)标准的分布式多层次的体系结构,后台应用java语言开发服务器端应用程序,前台采用Delphi 开发客户端应用程序,应用具有海量存储的大型Oracle数据库,采用开源的Jboss应用服务器进行逻辑处理.它借助校园网络传输数据,进行科学合理建设,实现各校区、各类商务收费、各种身份识别的一卡通行.
1.1 持久层总体架构
图1展示了一卡通系统数据库持久层的总体设计架构.
图1 一卡通系统数据库持久层的总体设计架构
在图1中,将应用层放在了持久层的上部,实际上在传统的项目中,应用层充当着持久层的一个客户端角色.持久层的接口大致可以分为以下几种类型:
(1)一些被用户的应用程序调用的,用来完成基本的创建、读取、更新、删除操作以及查询操作的接口.这些接口是持久层实现用户程序的商业逻辑的主要接口 ,包括Session、Transaction和Query.
(2)持久层用来读取诸如映射表这类配置文件的接口,典型的有Configuration类.
1.2 持久层详细设计
(1)对象持久化类
ClassPersister接口封装了把一个对象实例持久化到数据库中的所有逻辑.ClassPersister类非常简单,它的三个属性isProxy、isPersistent和timeStamp分别指示一个类对象是否是一个代理、是否是从持久机制获取的以及由持久机制记录的最后一次被应用程序访问的时间.代理对象只包括系统和用户标识一个对象所需的最少信息,因为它们比完整的对象小,所以可以减少网络流量.当需要真正的对象的时候,发送给代理load消息,可以刷新对象的所有属性.属性isPersistent的重要性在于一个对象需要知道它已经存在于持久机制中还是新创建的,这将决定在保存对象时生成insert还是update语句.timeStamp属性被用于支持持久机制中的乐观锁.ClassPersister实现了多个方法:如load、delete等,它们是可以将对象持久化的.也
就是说,应用程序开发者不需要知道任何关于持久策略的知识就可以将对象持久化,只需要向对象发送这些消息,而对象自己完成其它的事情.
(2)持久化集合对象类
尽管Class Persister封装了使单个对象持久化的行为,但是还不够,因为常常需要操作多个持久对象.CollectionPersister类层次就支持这种操作,它支持一次保存、获取、删除多个对象.Collection Persister是一个抽象类,它捕获子类的公共行为但是不会直接被实例化.这个类允许定义用以限定对象范围的选择条件.
(3)事务接口类
Transaction接口类的实例是通过Transaction-Factory的beginTransacti0n方法获得.通过JDBC-Transaction类实现了transaction接口的各个方法.事务的典型生命周期 是:被创建,添加一系列操作任务,接受begin消息,然后或者提交事务、或者回滚事务、或者重试.只能在begin方法返回成功后,才能提交事务.否则要么回滚,要么当持久机制上的锁已经移除后,重试事务.提交和回滚事务的能力是非常重要的,因为事务是原子的,或者成功或者失败,只能将所有任务完全回滚或者完成所有任务后完全提交.
(4)缓存机制
缓存可以使应用程序避免为相同的数据项进行多次数据库读操作.如果应用程序需要读取一个持久化类的实例,但是并不打算修改它们,可以使用read—only缓存.这是最简单,也是实用性最好的策略.应用程序需要更新数据,可能read—write
缓存比较合适.
Session缓存.不管何时当传递一个对象给save,update或者saveOrUpdate,或者使用load,find,iterate或者filter取得一个对象的时候,该对象被加入到Session的内部缓存中.当后继的flush被调用时,对象的状态会和数据库进行同步.如果在处理大量对象并且需要有效的管理内存的时候,可能不希望发生这种同步,evict方法可以从缓存中去掉对象和它的集合.在SessionFactory中定义了一些方法来从缓存中清除一个实例、整个类、集合实例或者整个集合.
推荐文章
论坛热帖