中国安防行业网

首页 > 企业新闻 > 技术动态 > 正文

一卡通系统中持久层的设计与其实现
2008/2/28 10:17:00   中国一卡通网   周化峰 张明扬   关键字:      浏览量:
计算机应用软件发展到现在由单层体系结构发展为多层体系结构,而三层结构是目前典型的一种应用软件结构.它包括表述层:提供与用户的交互界面;业务逻辑层:实现多个业务逻辑;数据库层:负责存放和管理应用的持久性业务数据.而hibernate是连接java应用程序的关系数据库的中间件J,在分层软件架构中它位于持久层,封装了所有数据访问细节,使业务逻辑层可以专注于业务逻辑。

    计算机应用软件发展到现在由单层体系结构发展为多层体系结构,而三层结构是目前典型的一种应用软件结构.它包括表述层:提供与用户的交互界面;业务逻辑层:实现多个业务逻辑;数据库层:负责存放和管理应用的持久性业务数据.而hibernate是连接java应用程序的关系数据库的中间件J,在分层软件架构中它位于持久层,封装了所有数据访问细节,使业务逻辑层可以专注于业务逻辑。 

    1一卡通系统持久层的设计

    一卡通系统是基于J2EE(Java2EnterpriseE-dition建立在Java2平台上的企业级应用的解决方案)标准的分布式多层次的体系结构,后台应用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)持久化集合对象类

    尽管ClassPersister封装了使单个对象持久化的行为,但是还不够,因为常常需要操作多个持久对象,CollectionPersister类层次就支持这种操作,它支持一次保存、获取、删除多个对象,CollectionPersister是一个抽象类,它捕获子类的公共行为但是不会直接被实例化,这个类允许定义用以限定对象范围的选择条件。 

    (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中定义了一些方法来从缓存中清除一个实例、整个类、集合实例或者整个集合。 

    (5)持久管理器类

    Session起着持久管理器的功能,它由Session—Facrory生成,在运行时刻Session维护到持久机制(关系数据库)的连接并管理持久机制的交互.Session实际上是在Connection、Query、Criteria和Transaction之间扮演了一个协调者,因为它是这些类的实例提交自己并被处理的地方,Session借助SessionFactorylmplementor和Sessi0nImplement0r与SQL生成器类层次,映射类层次和持久化机制类层次进行交互。 

    启动应用程序时,开始要做的事情之一就是让Session将创建映射类(ClassMap,AttributeMap)实例所需要的信息从持久机制读进来,Session会在内存中缓冲这些映射类,以便在映射对象到持久机制的时候使用它们,Session的save、delete和load方法,将调用ClassPersister的相应方法来实现对象的持久化管理,如果已知某个持久化实例的标识符,Session的load方法可取出它,一种形式使用一个类对象作为参数,会把状态装载到另一个新创建的对象中去.另一种是给出一个实例,会在其中装载状态。 

    1.3持久层的应用实现

    在一卡通系统中,所有的业务对象,如用户对象、帐户对象、报表对象、权限对象、角色对象、日志对象等,都由持久层持久化服务将其映射至数据库中相关的表,这些对象之间的关系表,如一对一、一对多、多对多等也由持久层映射中的onetoone、manytoone、collection的manytomany、onetomany等元素映射在持久化对象中。

    1.3.1持久层配置

    持久层的配置使用xml(eXtensibleMarkupLanguage扩展性标识语言)进行配置,配置文件命名为hibernate.cfg.xm1.我们主要配置数据库连接的各种参数和根据项目的进展逐步添加涉及的映射文件,以供持久层管理事务、产生SQL和管理JDBC连接等。

    1.3.2数据表的设计

    数据库设计主要是对各个业务对象设计相应的表和它们之间的关系表,同一般的数据库设计一样,一卡通系统包括学校基本信息表、食堂营业部门表、帐户表、卡表、卡类型表、消费数据表及操作日志表等等,多数表之问存在关系,如帐户和卡之问存在一对多的关系、卡类型和卡之问存在一对多的关系等。 

    1.3.3实体Bean(EntityBean)的编写

    将一卡通系统中所有需要持久化的类以标准JavaBean的形式编写,对每一个属性值都要有public的getXXX和setXXX,命名符合bean方法的命名规则。 

    1.3.4映射(Mapping)文件的编写

    Mapping文件写得正确与否关系着持久层的持久化服务能否正常运行;写得是否合适对整个解决方案的性能也有很大的影响。在这里,需要注意的就是各种关系的映射,映射文件的放置位置要和配置文件hibernate.cfg.xml中指明的位置保持一致。 

    1.3.5持久化对象操作

    先用Configuration方法调用properties文件进行系统环境的初始化配置,并且利用addClass分别调用映射资源文件(object.xm1)和映射类文件(object.class)。调用configuration.getproperties,检查所使用的数据库,检查表的关联性,一对多等关系的设置,检查外键约束性等.使用数据库的JDBC的驱动连接数据库,查看所用数据库连接池,同时检验JNDI等的配置情况。 

    2程序的执行

    显示结果,启动应用服务器jboss进行系统的初始化,实现持久层与Oracle数据库的连接.如图2在eclipse(java开发环境)的控制台中的运行结果。 


    图2eclipseIDE下程序的jboss启动服务的初始化运行结果

    3结束语

    利用持久层的对象持久化服务,可以有效地进行数据库数据到业务对象的O/R映射,简化了客户端对数据库的操作过程,并且在项目后期维护、程序修改以及更换数据库

相关专题:

相关新闻:
加载中...
加载中...