??xml version="1.0" encoding="utf-8" standalone="yes"?>
数据库事务的特征Q?/span>
ACID
Atomic
Q原子性)?/span>
Consistency
Q一致性)?/span>
Isolation
Q隔L)?/span>
Durability
Q持久性)?/span>
DBMS
用日志来保证数据的原子性、一致性和持久性;用锁的机制来保证数据的隔L?/span>
二?span style="FONT: 7pt 'Times New Roman'">
事务的边?/span>
数据库支?/span>
2
U事务模式:自动提交和手动提交?/span>
JDBC API 的事务边?/span>
Hibernate API 声明事务边界
注:一?/span>
session
可以对应多个事务Q但是推荐的做法是一?/span>
session
对应一个事务?/span>
三?/font>
多事务的q发问题
当多个事务同时访问相同的数据的时候,E序如果没有采取适当的隔L施,׃发生数据库的q发问题。常见的q发问题有:
W一cM失更斎ͼ撤消事务的时候,把其他的事务已经提交的数据给覆盖了;
脏读Q读了没有提交的数据Q?/span>
虚读Q一个事务读到另外一个事务已l提交的新插入的数据Q?/span>
不可重复读:一个事务读到另外一个事务已l提交的更新的数据;
W二cM失更斎ͼ一个事务覆盖另外一个事务已l提交的更新数据?/span>
四?/strong> ?/span>
一般地Q大型的
DBMS
都会自动的管理锁定机Ӟ但是在对数据的安全性、完整性和一致性有Ҏ要求的地方,可以׃务本w来理琐的机制?/span>
有一点要x的是Q锁的粒度越大,隔离性越好,q发性越差?/span>
按照锁的E度来分有:
׃n锁:用读操作Q非独占的,其他事务可以读,但是不能更新Qƈ发性好Q?/span>
独占锁:用与
insert update
?/span>
delete
{语句,其他事务不能读,也不能改Qƈ发性差Q?/span>
更新锁:执行
update
的时候,加锁?/span>
ȝQ多是事务分别锁定了一个资源,又请求锁定对方已l锁定的资源Q就造成了请求环?/span>
降低死锁的最好办法是使用短事务?/span>
五?/font>
数据库的事务隔离U别
数据库提?/span>
4
U事务隔ȝ别:
Serializable
Q串行化Q(隔离U别最高)
1
Repeatable Read
Q可重复读;
2
Read Commited
Q读已提交数据;
4
Read Uncommited
Q读未提交数据;Q隔ȝ别最低)
8
Hiberate
中的隔离U别的设|?/span>
?/span>
Hibernate
的配|文件中
hibernate.connection.isolation=2
六?/font>
悲观锁和乐观?/span>
从应用程序的角度来看Q锁分ؓ悲观锁和乐观锁?/span>
悲观锁:昄的ؓE序加锁Q但是降低ƈ发性?/span>
Select …? For update;
?/span>
Hibernate
中的代码
Session.get(Account.class,net Long(1),LockMode.UPGRADE)
Q?/span>
//
E序采用悲观?/span>
乐观锁:依靠
DBMS
来管理锁Q程序依靠版本控制来避免q发问题?/span>
在对?/span>
-
关系映射的文件中Q用
<version>
或?/span>
<timestamp>
可以理q发。乐观琐比悲观琐有更好的q发性,优先考虑乐观琐?/span>
l
延迟索;
l
立即索;
l
q切左外q接Q?/span>
Hibernate
提供
2
U方式来定索策略,一中是在配|文件当中,另外一U是在程序种讄。当Ӟ如果你在E序中设|了索策略,那么你在配置文g中的讄也就无效了。另外的一U情冉|
HQL
会忽略配|文件的讄Q而L采用q切左外q接?/span>
一?/span>
cȝ别的?/span>
可以选择的检索策略是立即索和延迟索,默认的是立即索。用配置文g中的
<class>
节点?/span>
lazy
来控制?/span>
注意Q不你在配|?/span>
class
?/span>
lazy
?/span>
true
q是
false
Q对
get()
?/span>
create
Criteria
()
Ҏ都不起作用,只有?/span>
load()
Ҏ起作用?/span>
当你使用的检索策略是
lazy
的时候,当你执行
Customer customer = (Customer)session.load(Customer.class,new Long(1));
的时候,
Hibernate
不从数据库检索数据,而只是生一个代理类Q只有当你执?/span>
Customer.getName();
的时候, Hibernate 才到数据库取数据。所以,如下的代码是会被抛出异常的:
get()
ҎL用的立即索,如果和它相关联的cM是用的立x索,那么也会把相兌的数据也索出来?/span>
二?/span>
一对和多对多关联检?/span>
一般地Qؓ了有减少Ҏ据库的访问,我们往往用gq检索的{略。所以,我们优先使用如下方式Q?/span>
<set class=”order?inverse=”true?lazy=”true?>
但是Q我们在索“多”的一方的时候,
Hibernate
不能为我们生代理类。由此,我们p?/span>
betch-size
的配|来减少
SQL
语句?/span>
当我们?/span>
outer-join
属性的时候,我们没有必要?/span>
lazy
属性了?/span>
Outer-join
会一ơ将“一”方和与之相关的“多”方用左外连接的方式索出来?/span>
Session session = sessionFactory.openSession();
Transaction tx = null;
tx = session.beginTransaction();
Customer customer = (Customer)session.get(Customer.class,new Long(1));
产生?/span>
SQL
语句如下Q?/span>
Hibernate: select customer0_.ID as ID1_, customer0_.NAME as NAME2_1_, orders1_.CUSTOMER_ID as CUSTOMER3_3_, orders1_.ID as ID3_, orders1_.ID as ID0_, orders1_.ORDER_NUMBER as ORDER2_1_0_, orders1_.CUSTOMER_ID as CUSTOMER3_1_0_ from sampledb.customers customer0_ left outer join sampledb.orders orders1_ on customer0_.ID=orders1_.CUSTOMER_ID where customer0_.ID=?
首先我们要解决一个问题就是,Z么我们要使用 Hibernate 技术。在 JAVA 世界中,已经有了?/span> SUN 提出的业界的标准 J2EE 规范Q在规范中没有提到有 ORM 的媄子,如果你说有的话,那也只是 CMP Q容?/span> Bean Q和 ORM 有些似。但是毕?/span> EJB 是个重量的东东,在你享受 EJB 带给你的U种优厚的待遇同Ӟ你就不得不背负沉重的枷锁Q这也就是ؓ什么种U轻量的框架在 JAVA C大行光的原因之一。那么有没有一U方案我们可以在不使用 EJB 的时候,q可以从容而且优雅的实C对象到数据库?/span> mapping 呢?当然Q那是 Hibernate ?/span>
在介l?/span> Hibernate 之前Q首先让我们来看看Y件的几种模型?/span>
一、Y件模?/span>
l 概念模型Q?/span>
概念模型清楚的描q出了问题域的实体。我们可以用一对一、一对多和多对多的关pL描述实体之间的关pR这U关pL技术h员和非技术h员都可以理解的,所以,我们要让客户或者领域专家帮助系l分析h员对概念模型中出现的问题做出修改?/span>
l 关系数据模型Q?/span>
当前的计机只能用具有某U结构的形式来描q现实世界中的事物。从《数据结构》中我们知道Q计机世界中常用的数据l构有线形结构,树和图三大类l构。而表属于UŞl构中的一U。计机可以很方便的处理表这U结构的数据Q所以,当前采用最q泛的还是关pd数据库(以后U数据库Q?/span>
数据库通过用表Q表的烦引,视图和表与表之间的参照完整性来描述概念模型?/span>
l 域模型和域对象:
我们需要在概念模型的基上创建域模型Q也叫做设计模型。域模型的主要内ҎQ?/span>
域对象:
域对?/span> (Domain Object) Q是构成域模型的基本元素Q代表业务中的h、事物等。分以下三种Q实体域Q?/span> J2EE 中的代表是实?/span> bean Q过E域Q?/span> J2EE 中的代表?/span> Session bean 或者是消息驱动 Bean Q事件域Q代表应用中的事件?/span>
域对象之间的关系Q?/span>
1 、关?/span>
一对多的单向关?br /> 一对多的双向关?/span>
2 、依?/span>
如果存在
class A
?/span>
new class B
Q就?/span>
A
依赖
B
。在实际的开发中Q往往是过E域倚赖实体域。在
J2EE
的世界中Q就是往往是由
Session Bean
来调用实?/span>
Bean
?br />
3
、聚?
描述整体和局部的关系?/span>
4 、一般化
往往指类的承关p?/span>
二?/span> ORM 介绍
ORM 的目的就是要把对象和关系?/span> mapping 。从上面的分析可以看出,二者的出发Ҏ不同的,关系模型是面向关pȝQ域模型是面向对象的。它们的 mapping 如下Q?/span>
面向对象 |
面向关系 |
c?/span> |
?/span> |
对象 |
表中的记?/span> |
属?/span> |
表中的字D?/span> |
三?/span> JAVA 世界中的其他持久化模?/span>
1 、主动域对象模式
2 ?/span> JDO 模式
3 ?/span> CMP 模式Q和 ORM 和类|不过 CMP 是用?/span> EJB 容器当中Q用来持久化 EJB lgQ?/span>