持久性框架总结

持久性框架

何谓持久性框架
持久性框架是一组软件服务,将应用程序与其使用和操纵的数据源分离。持久性框架位于机构的数据源之上,隐藏访问这些数据源的数据访问API(如JDBC,JDO或实体EJB)。提供的服务应完全抽象和从这个数据源使用和操纵数据的物理细节。下图演示持久性框架在系统体系结构中的地位。

注:持久性框架就是DAO及其隐藏的对数据源的访问机制。

下图为体系结构各层功能性图示:

持久性框架中提供下列服务,让开发人员在持久性框架之上建立应用程序:

l 提供分开数据持久逻辑与表示和业务逻辑的整洁机制
在上面的体系结构框图中,只有业务层可以访问公司数据库。业务层用Data Access Object模式与公司数据库交互,而不用JDBC之类的数据访问API访问数据源。

l 不让框架上建立的应用程序了解数据所在的数据库平台
将所有数据连接逻辑包装到数据访问对象中后,业务应用程序的开发人员不需要知道连接的数据库平台类型,连接数据库时所需的任何安全信息(用户ID与口令)或数据库网址。

l 抽象数据库中存储数据的物理细节和数据库中数据实体之间存在的关系
建立在上述体系结构布局之上的应用程序不必直接对数据库发出SQL查询,不必知道数据的物理结构,而用数值对象访问数据库。

l 简化开发过程,隐藏打开数据库连接、发出数据读取与操纵命令和事物管理的细节
Data Access Object与Value Object模式完全分离业务应用程序的开发人员与其在应用程序中使用的数据源,不需要知道数据访问API,而用简单接口读取与操纵数据。

DAO模式很强大,因为:
l 它抽象数据源读取数据的方法。DAO模式可以用任何Java数据访问API进行处理,包括:
1. JDBC API ― JDBC是第一个标准数据库访问API,位于J2EE中,是J2SE的扩展。
2. SQLJ ― SQLJ是较新的API,是几个一流的数据库和Java应用程序服务器厂家提出的。SQLJ使开发人员可以把SQL代码直接嵌入Java代码中,然后用代码预处理器将其转换成Java代码。
3. 实体EJB ― 实体EJB规范是数据持久性规范,开发人员可以抽象组件体系结构中的数据库代码。
4. Java Data Object(JDO) ― JDO规范是最新的数据库访问API,可以用标准Java对象取得和保存数据库中的数据。JDO对象比实体EJB简单,同时仍然提供与实体EJB相似的功能。
l 整洁分离业务与数据逻辑,减少应用程序开发人员混合业务与数据逻辑的情形。把所有数据访问代码集中到一个逻辑结构之中,开发人员可以用逻辑接口读取与操纵数据。
l 提供一组标准编程接口,可以解决常见数据库开发问题,包括:
1. 主键生成
2. 并发性管理与锁
3. 事务管理
4. 性能问题

O/R Mapping技术
对于Java有许多持久化对象的方式。我们也非常关注Java应用程序的持久层。我将介绍一些著名的持久框架。本文将关注开源的O/R Mapping工具hibernate。
l JDBC
许多开发者用JDBC进行数据库程序的开发。此中方式很多情况下都使用DAO模式,采用SQL进行查询。虽然用此方式可以使应用程序代码与具体的数据库厂商和数据库位置无关,不过JDBC是低级别的数据库访问方式,JDBC并不支持面向对象的数据库表示。JDBC数据库表示完全围绕关系数据库模型。在大型应用程序中的DAO中书写这样的代码,维护量是非常大的。
l EJB
EJB通常是程序员的第二个选择,目的是更加规范的用持久对象对数据库访问。Entity EJB听起来就象银弹一样,因此它拥有了巨大的市场。然而,你必须去了解一个EJB容器,甚至花大价钱去购买。而且想要非常清楚的了解EJB规范也是非常费时的。在用EJB编码前,先要让专家理解API,然后需要了解每一个容器部署时所要关注的技术。此外,许多情况下商用容器的性能和支持也不是很好。
l JDO
4月JDO规范1.0提出可以使你将精力集中在设计Java对象模型,然后在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,简称POJOs),采用JDOQL语言进行SQL操作。一些公司(包括sun)企图根据JDO规范进行设计并实现JDO产品,然而他们都不能很好的进行实现。并且性能优化上比较差。
l ibatis
很多人对此可能非常不熟悉。ibatis是一个轻量级的持久层开发框架。目的也是提高持久层的设计与实现。它有二个核心组件SQL Maps和DAO,减少了JDBC代码并且抽象持久性实现细节。SQL Maps还将JavaBean映射到xml和sql中。对于关联表和执行复杂的查询不需要复杂的scheme。
下图为ibatis架构的描述:


l 其他持久性框架
下列框架不再介绍。其中TopLink是商用框架。Castor,OJB是值得关注的架构,尤其是后者。Cocobase,expresso相对比较大,但也值得关注。
Infobjects ObjectDRIVER- http://www.infobjects.com
LiDO - http://www.libelis.com
InterSystems Cache - http://www.intersystems.com
SimpleOrm - http://www.SimpleOrm.org
VBSF - http://www.objectmatter.com
The ProductivityEnvironmentForJava (PE:J) - http://www.hywy.com/
JDX - http://www.softwaretree.com
Cayenne - http://objectstyle.org/cayenne/
TopLink - http://otn.oracle.com/products/ias/toplink/content.html
EnterpriseObjectsFramework - http://www.apple.com/webobjects/
Jakarta ObjectRelationalBridge - http://jakarta.apache.org/ojb
Castor - http://castor.exolab.org
Jaxor - http://jaxor.sourceforge.net
Cocobase - http://www.thoughtinc.com
Expresso - http://www.jcorporate.com
DataBind - http://databind.sourceforge.net
JdoGenie - http://www.hemtech.co.za/jdo
Abra - http://abra.sourceforge.net
KodoJdo - http://www.solarmetric.com/Software/Kodo_JDO/
Persistence EdgeXtend - http://www.persistence.com/products/edgextend/
FrontierSuite for J2EE & J2SE - http://www.objectfrontier.com
FrontierSuite for JDO - http://www.objectfrontier.com
BasicWebLib - http://basicportal.sourceforge.net/

hibernate
Hibernate使你可以用Java机制开发持久对象 ― 包括关联,继承,组合和Java集合框架。 HQL是一个简化的对SQL的在OO机制上的扩展,在对象和关系数据库间提供一个桥的作用。Hibernate现在是Java世界中比较流行的ORM解决方案。
提供HQL语言;透明持久性;复杂的ORM;简单但强大的API;自动PK生成;O/R Mapping定义;双层cache架构;高性能;J2EE集成,对JMX,JCA等技术的支持;详细文档;开源软件的支持。。。等等特性。

good;)

Very good conclustion!

Let's give tyrones warm applause!!!

Here, I am gonna say a little bit more about O/R Mapping

. Since there are differences between Object and RDB, which is called impedence mismatch. So we need a bridge: O/R Mapping

. There are three kinds of mapping, attribute mapping, hierarchy mapping, relationship mapping

. In attribute mapping, an attribue could map zero or more columns in R-DB (not all attributes are persistent)

.In relationship mapping, there are 3 relationships: one2one, one2many, many2many. We could use foreign key in RDB to apply these 3 relationships. For many2many relationship, we could introduce association-table to get it.

.In hierarchy mapping, there are 3 ways to do implementation.
1.Map the entire class hierarchy to a single table
2.Map each concrete class to its own table
3.Map each class to its own table

也补充一点
EJB的CMP中使用CMR来表示类之间的关系,个人感觉在一对多 或一对一时用比较好,多对多还是使用数据库的association-table比较清楚点。

To banq,
我记得EJB的CMR在多对多的情况下不也是在数据库里自动建立一个链接表吗?
请指教。

好文章呀!
继续关注!

May I point out the source?
http://www.theserverside.com/home/thread.jsp?thread_id=19318&article_count=61

BTW, you claim JDOs is slow? or maybe you got the feeling after reading some people's FUD? But make such kind of statement especially on performance, you'd better know what are you talking? Today most jdo implements use BCM in one form or another. There is another good thread cover that in "there"

-Jevang

dsfsda

图呢?

aa

How about Ofbiz's Entity Engine

I think it deserves attention