Hibernate实战_笔记1(Hibernate基础理论)

什么是持久化

      几乎所有的应用程序都需要持久化数据。持久化在应用程序开发中是基本概念之一。如果一个信息系统在断电时没有保存数据,这个系统就没有什么实用价值了。

关系数据库

      关系技术是个已知数,仅此一点就成为许多组织选择它的一个充分理由。关系数据库可以有效保证和保护数据的完整性,这是它众多的优良特性之一。
      关系数据库管理系统既不特定于Java,也不是一种特定于某个特殊应用程序的关系数据库。这个重要的原理就是数据独立(data independence)。

理解SQL

      要有效地使用Hibernate,扎实地理解关系模型和SQL是前提条件。你需要理解关系模型,以及像保证数据完整性的标准化这样的话题,还要利用你的SQL知识调优Hibernate应用程序的性能。Hibernate让许多重复的编码任务自动化,但是如果要利用现代SQL数据库的全部功能,你的持久化技术必须扩充至超越Hibernate本身。记住,根本的目标是稳健、高效的持久化数据管理。

      要有效地使用Hibernate,扎实地理解关系模型和SQL是前提条件。你需要理解关系模型,以及像保证数据完整性的标准化这样的话题,还要利用你的SQL知识调优Hibernate应用程序的性能。Hibernate让许多重复的编码任务自动化,但是如果要利用现代SQL数据库的全部功能,你的持久化技术必须扩充至超越Hibernate本身。记住,根本的目标是稳健、高效的持久化数据管理。
回顾一些本书中用到的SQL术语。你用SQL作为数据定义语言(Data Definition Language,DDL),用CREATE和ALTER语句创建数据库Schema。创建了表(和索引、序列等)之后,又用SQL作为数据操作语言(Data Manipulation Language,DML)来操作和获取数据。操作数据的操作包括插入(insertion)、更新(update)和删除(deletion)。通过限制(restriction)、投影(projection)和联结(join)操作(包括笛卡儿积,Cartesian product)执行查询来获取数据。为了有效地生成报表,可视需要使用SQL对数据进行分组(group)、排序(order)和统计(aggregate)。甚至可以相互嵌套SQL语句:这种技术使用了子查询(subselect)。

在Java中使用SQL

      在Java应用程序中使用SQL数据库时,Java代码通过Java数据库连通性(Java DatBase Connectivity,JDBC)API把SQL语句发到数据库。无论是手工编写SQL并嵌入到Java代码里面,还是由Java代码在运行中生成,都要用JDBC API绑定实参,来准备查询参数、执行查询、滚动查询结果表、从结果集中获取值,等等。

      在过去的15年里,开发人员一直在谈论范式不匹配的问题。这种不匹配解释了为什么都要在每一个企业项目中与持久化相关的问题上付出如此巨大的努力。这里所说的范式(paradigm)是指对象模型和关系模型,或者可能是面向对象编程(Object-Oriented Programming,OOP)和SQL。

面向对象应用程序中的持久化

      在面向对象的应用程序中,持久化允许一个对象在创建之后依然存在。对象的这种状态可以被保存到磁盘,且相同状态的对象可以在未来的某个时候被重新创建。
这并非只限于单独的对象——整个关联对象网络也可以被持久化,且以后在一个新的进程中被重新创建。大多数对象并不是持久化的;瞬时(transient)对象的生命周期有限,由实例化它的进程的寿命所决定。几乎所有的Java应用程序都混合包含了持久对象和瞬时对象;因此,我们需要一个子系统来管理持久化数据。数据库管理系统负责管理并发性和数据的完整性;它们负责在多用户和多应用程序之间共享数据。

范式不匹配

      对象/关系范式不匹配可以分为几个部分,我们将依次进行分析。让我们从独立于问题的一个简单示例开始探讨。构建它时,就会开始看到不匹配问题的出现。
假设你必须设计和实现一个在线电子商务应用程序。在这个应用程序中,需要用一个类表示一个系统用户的信息,用另一个类表示用户的帐单的明细,如图


      在这幅图中,可以看到一个User有许多BillingDetails。可以从两个方向遍历类之间的关系。表示这些实体的类可能极为简单:

public class User {
	private String username;
	private String name;
	private String address;
	private Set billingDetails;
	
	// Accessor methods (getter/setter), business methods, etc.
}

public class BillingDetails {
	private String accountNumber;
	private String accountName;
	private String accountType;
	private User user;
	
	// Accessor methods (getter/setter), business methods, etc.
}
可以很容易地给这个例子想出一个好的SQL Schema设计:

create table USERS(
	USERNAME varchar(15) not null primary key,
	NAME varchar(50) not null,
	ADDRESS varchar(100)
);
create table BILLING_DETAILS(
	ACCOUNT_NUMBER varchar(10) not null primary key,
	ACCOUNT_NAME varchar(50) not null,
	ACCOUNT_TYPE varchar(2) not null,
	USERNAME varchar(15) foreign key references USER
);

      这两个实体之间的关系表示为外键(foreign key),如BILLING_DETAIL中的USERNAME。对于这个简单的领域模型,对象/关系的不匹配几乎不明显;编写JDBC代码来插入、更新和删除关于用户和帐单明细的信息很简明。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值