当前位置: 首页 > 图文教程 > Java技术 > 数据库持久层 > 数据库持久层:谈hibernate的持续性
几乎所有的应用都需要持续性数据。持续性在应用开发中是一个基本的概念。如果当主
机停电时一个信息系统没有保存用户输入的数据,这样的系统几乎没有实际的用途。当我们
讨论Java中的持续性时,我们通常是指使用SQL存储在关系数据库中的数据。我们从简单地查看一下这项技术和我们如何在Java中使用它开始。具有了这些知识之后,我们继续关于持续性的讨论以及如何在面向对象的应用中实现它。
1 关系数据库
你,像许多其他的开发者,很可能在使用一个关系数据库进行工作。实际上,我们中的
大多数每天都在使用关系数据库。关系技术是一个已知数。仅此一点就是许多组织选择它的
一个充分的理由。但仅仅这样说就有点欠考虑了。关系数据库如此不易改变不是因为偶然的
原因而是因为它们那令人难以置信的灵活与健壮的数据管理方法。
关系数据库管理系统既不特定于Java,也不特定于特殊的应用。关系技术提供了一种在
不同的应用或者相同应用的不同技术(例如事务工具与报表工具)之间共享数据的方式。关
系技术是多种不同的系统与技术平台之间的一个共同特征。因此,关系数据模型通常是业务
实体共同的企业级表示。
关系数据库管理系统具有基于SQL的应用编程接口,因此我们称今天的关系数据库产品为
SQL数据库管理系统,或者当我们讨论特定系统时,称之为SQL数据库。
2 理解SQL
为了有效地使用Hibernate,对关系模型和SQL扎实的理解是前提条件。你需要用你的SQL
知识来调节你的Hibernate应用的性能。Hibernate会自动化许多重复的编码任务,如果你想
利用现代SQL数据库的全部能力,你的持续性技术的知识必须扩充至超过Hibernate本身。记住基本目标是健壮地有效地管理持续性数据。
CREATE
与ALTER命令来创建数据库模式。创建了表(索引,序列等等)之后,你又将SQL作为数据处理语言(DML)来使用。使用DML,你执行SQL操作来处理与取出数据。处理操作包括插入,更新和删除。你使用约束,投射,和连接操作(包括笛卡尔积)执行查询来取出数据。为了有效地生成报表,你以任意的方式使用SQL来分组,排序和合计数据。你甚至可以相互嵌套SQL命令,这项技术被称作子查询。你也许已经使用了多年的SQL并且非常熟悉用它编写的基本操作和命令。尽管如此,我们的经验还是告诉我们SQL有时难于记忆并且有些术语有不同的用法。
关系数据库是ORM的一部分,当然另一部分由你的Java应用中的对象构成,它们需要使用SQL被持续化到数据库中。
3 在Java中使用SQL
当你在Java应用中使用SQL工作时,Java代码通过Java数据库连接(JDBC)执行SQL命令来操作数据库。SQL可能被手工编码并嵌入到Java代码中,或者可能被匆忙地通过Java代码生成。你使用JDBC API将变量绑定到查询参数上,开始执行查询,在查询结果表上滚动,从结果集中取出值,等等。这些都是底层的数据访问任务,作为应用开发者,我们对需要这些数据访问的业务问题更加感兴趣。需要我们自己来关心这些单调的机械的细节,好像并不是确定无疑的。
我们真正想做的是能够编写保存和取出复杂对象(我们的类实例)的代码—从数据库中
取出或者保存到数据库中,尽量为我们减少这些底层的苦差事。
因为这些数据访问任务通常都是非常单调的,我们不禁要问:关系数据模型特别是SQL是
面向对象的应用中持续性问题的正确选择吗?我们可以立即回答这个问题:是的!有许多原
因使SQL数据库支配了计算行业。关系数据库管理系统是唯一被证明了的数据管理技术并且几乎在任何Java项目中都是一项需求。
然而,在过去的15年里,开发者一直在讨论范例不匹配的问题。这种不匹配解释了为什
么每个企业项目都需要在持续性相关的问题上付出如此巨大的努力。这里所说的范例是指对
象模型和关系模型,或者可能是面向对象编程与SQL。让我们通过询问在面向对象的应用开发环境中,持续性究竟意味着什么,来开始我们对不匹配问题的探究。首先,我们将本章开始部分声明的对持续性过分简单的定义扩展到一个较宽的范围,更成熟的理解包括维护与使用持续性数据。
4 面向对象应用中的持续性
在面向对象的应用中,持续性允许一个对象的寿命可以超过创建它的程序。这个对象的
状态可能被存储到磁盘上,并且在将来的某一时刻相同状态的对象可以被重新创建。
这样的应用不仅仅限于简单的对象——关联对象的完整图形也可以被持续化并且以后可
以在新的进程里被重新创建。大多数对象并不是持续性的;暂态对象只有有限的寿命,被实
例化它的进程的寿命所限定。几乎所有的Java应用都在混合使用持续与暂态对象;因此,我们需要一个子系统来管理我们的持续性数据。
现代的关系数据库为持续性数据提供了一种结构化的表示方法,允许排序,检索和合计
数据。数据库管理系统负责管理并发性和数据的完整性;它们负责在多个用户和多个应用之
间共享数据。数据库管理系统也提供了数据级别的安全性。
■ 存储,组织与恢复结构化数据
■ 并发性与数据完整性
■ 数据共享
特别地,我们将在使用域模型的面向对象的应用环境中考虑这些问题。
使用域模型的应用并不直接使用业务实体的扁平表示进行工作,这些应用有它们自己的
面向对象的业务实体模型。如果数据库中有“项目”与“竞价”表,则在这些Java应用中会定义“项目”与“竞价”类。
然后,业务逻辑并不直接在SQL结果集的行与列上进行工作,而是与面向对象的域模型进
行交互,域模型在运行时表现为一个关联对象的交互图。业务逻辑从不在数据库中(作为SQL存储过程)执行,而是被实现在Java程序中。这就允许业务逻辑使用成熟的面向对象的概念,例如继承与多态。我们可以使用众所周知的设计模式例如“策略”,“中介者”和“组合” ,
所有这些模式都依赖于多态方法调用。现在给你一个警告:并不是所有的Java应用都是按照这种方式设计的,并且也不打算是。对于简单的应用不使用域模型可能会更好。SQL和JDBC API可以完美地处理纯扁平数据,并且现在新的JDBC结果集已经使CRUD操作变得更简单了。使用持续性数据的扁平表示进行工作可能更直接并且更容易理解。
然而,对于含有复杂业务逻辑的应用,域模型有助于有效地提高代码的可重用性和可维
护性。在本书中我们集中在使用域模型的应用上,因为通常Hibernate和ORM总是与这种类型的应用有关。
如果我们再次考虑SQL和关系数据库,我们最终会发现这两种范例的不匹配之处。
SQL操作例如投射与连接经常会导致对结果数据的扁平表示。这与在Java应用中用来执行
业务逻辑的关联对象的表示完全不同!这是根本不同的模型,而不仅仅是相同模型的不同的
显示方式。
评论 (0) All