Hibernate
内容: 对象持久化[重点]
映射[重点,难点]
持久对象状态的管理
其他:HQL、事务
对象持久化:内存中以对象形式存储的Data转存到外部持久设备中,以备日后恢复到内存中
原因:
物理原因:内存不持久,硬盘、闪存、光盘、磁带机、打孔带持久设备
内存容量有限无法匹配海量的用户数据
业务原因:业务数据需求共享,由公共的持久设备提供服务(公共,公开的访问机制)
数据海量要求提供大规模检索服务
数据管理(安全,备份)
设计原因:ORM进行OR转换
结论:对象持久化是必须的,企业级必须使用数据库作持久化,使用轻量级ORM框架
实施方法:对象序列化:短时间少量数据的持久化
数据库存储:全面的持久化,使用JDBC,EJB2.X的EntityBean,轻量级的ORM框架
JDBC:功能完备,效率最高
代码量大,开发难度大
EJB2.X:封装JDBC
EJB API过于复杂,重量级解决方案(捆绑服务器软件)
[成本高,学习曲线大,开发周期长,测试困难,功能不全]
轻量级ORM框架:封装JDBC,提供简单API,轻量级解决方案
[成本低,学习简单,专业性强,使用POJO,测试方便,功能比较完备]
结构与工作原理:Hibernate读取配置文件XML,解析成JDBC代码,自动连接数据库生成相应对象或存储数据
程序员工作:持久化对象定义,数据库关系表结构,Hibernate配置文件,APP应用程序
开发步骤:编写持久化对象
编写Hibernate的XML配置文件
数据库表结构
APP应用程序(调用Hibernate)
Hibernate结构:Session s对应JDBC中的Connection con
应用:生成Session对象
Configration cfg=new Configration().configure();
SessionFactory sf=cfg.buildSessionFactory();//重量级对象,线程安全,一个程序一个sf
Session s=sf.openSession();
//轻量级对象,线程不安全,一个线程一个s,一个s一个事务
s.save(Object);
s.update(Object);
s.delete(Object);
s.createQuery(HQL);
s.getTransaction().commit();
s.getTransaction().rollback();
实验:环境:Hibernate类库
步骤:同上
目的:po结构,映射文件结构,Hibernate的API
Po的结构:1 对象标识符
类>>表,属性>>字段[对象>>记录]
自然键不方便,额外添加中性主键(对象标识符)
获得标识符算法:高低位算法[数据库计数器为高位保证连续性,本地计数器为低位保证差异性]
2 必须有空的构造方法
3 属性具有set/get方法
映射文件:(Hibernate配置文件)
一个文件映射一个po:单一实体映射,无映射关系
文件名与po匹配,po名.hbm.xml
映射文件与po在同一个包下
持久对象状态管理:
生命周期:
Transient 暂态:对象在内存中存在,但数据库中无记录且与Session无关
有内部状态,无外部状态,手动同步
Persistent 持久态:数据库中有记录且与Session有关
有内部状态,有外部状态,自动同步
Detached 游离态:数据库中有记录,但与Session无关
有内部状态,有外部状态,手动同步
同步的管理:
Hibernate的API:load(),get(),list(),
save(),saveorupdate(),delete(),
clear(),close(),evict()
update(),saveorupdate(),lock()
flush()应用:缓存与对象同步,缓存与数据库数据同步
事务提交前隐含flush操作
查询更新字段时,提交操作前隐含flush操作
APP调用flush操作
flushmodel:FlushModel.AUTO,
FlushModel.COMMIT,
FlushModel.NEVER
批量更新:session.flush();
session.clear();
其他:
HQL语法:与SQL类似,HQL查询OO,SQL查询基本类型
Mappong Entity:
<id>中的<generator class="?">算法:
assigned算法:由程序员手动赋值
hilo算法:高低位算法[数据库计数器为高位保证连续性,本地计数器为低位保证差异性]
seqhilo算法:默认序列hibernate_sequence适用于Oracle
<generator class="seqhilo"/>
identity算法:MySQL,DB2,Sybase,MS SQL数据库
<generator class="identity"/>
sequence算法:Oracle数据库
<generator class="sequence"/>
native算法:自动依据数据库中的Dialect决定适用算法
<generator class="native"/>
uuid.hex算法:内存中计算赋值
<generator class="uuid.hex"/>
hibernateType:
Entity:独立的持久对象
Values:值类型(基本类型)
integer,long,short,float,double,character,byte,boolean,yes_no,true_false
实体关系映射:
关联关系映射:关联关系特点[双边关系,具有方向性,关系描述名称、数量、角色、关系强度]
基数关系映射:基于数量的映射
一对一映射:
Account: <one-to-one name="addr"
cascade="save-update"
property-ref="act"/>
User:<many-to-one name="act"
column="FID"
unique="true"
cascade="all"/>
Account: <one-to-one name="owner"
cascade="save-update"/>
User: <id name="oid" column="OID">
<generator class="foreign">
<param name="property">act</param>
</generator>
</id>
<one-to-one name="act"
cascade="all"
constrained="true"/>
一对多(多对一)映射:
Account:<many-to-one name="owner"
column="FID"
cascade