Hibernate 培训.docx
- 文档编号:3583151
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:21
- 大小:142.78KB
Hibernate 培训.docx
《Hibernate 培训.docx》由会员分享,可在线阅读,更多相关《Hibernate 培训.docx(21页珍藏版)》请在冰豆网上搜索。
Hibernate培训
广州合作
Hibernate技术交流
文档标题
2010年09月05日
文档修订页
版本号
修改日期
变更编号
编写
评审
批准
修改内容
0.1
2010-09-05
Learncy
建立
目录
文档修订页2
目录3
1分层思想5
1.1软件分层5
1.2Java应用的持久化层6
1.3Hibernate是持久化层的一种实现6
2软件模型7
2.1概念模型7
2.1.1购物网站应用的概念模型8
2.1.2实体与实体之间有三种关系8
2.2域模型8
2.2.1关联关系9
2.2.2依赖关系9
2.2.3聚集关系9
2.2.4一般化关系10
2.3域对象10
2.3.1实体域对象11
2.3.2过程域对象11
2.3.3事件域对象11
2.3.4域对象的持久化概念12
2.4通过JDBCAPI来持久化实体域对象12
2.4.1JDBCAPI13
2.4.2JDBC编程的缺点13
2.5对象—关系映射13
2.5.1ORM模式14
2.5.2对象-关系映射(Object-RelationMapping)的概念14
2.5.3域模型与关系模型之间存在许多不匹配之处14
2.5.4域模型与关系模型之间的不匹配举例15
2.5.5通过HibernateAPI操纵数据库15
3HibernateAPI简介16
3.1Configuration接口16
3.2SessionFactory接口16
3.3Seission接口17
3.4Transaction接口17
3.5Query和Criteria接口17
3.6回调接口17
3.7hibernate映射类型接口18
3.8可扩展借口18
4Hibernate的映射类型18
4.1Hibernate的内置映射类型18
4.2客户化映射类型20
5三种状态20
5.1Hibernate三种状态20
5.2Customer对象状态转移过程示例20
5.3三种对象之间的迁移图21
5.4临时态特征21
5.5持久化对象特征22
5.6游离对象特征22
6Hibernate缓存22
6.1缓存概述22
6.2Hibernate缓存23
1分层思想
1.1软件分层
层与层之间存在自上而下的依赖关系,即上层组件会访问下层组件的API,而下层组件不应该依赖上层组件。
例如:
表述层依赖于业务逻辑层,而业务逻辑层依赖于数据库层。
每个层对上层公开API,但具体的实现细节对外透明。
当某一层的实现发生变化,只要它的API不变,不会影响其他层的实现。
如图所示:
1.2Java应用的持久化层
1.3Hibernate是持久化层的一种实现
2软件模型
在软件开发领域,模型用来表示真实世界的实体。
在软件开发的不同阶段,需要为目标系统创建不同类型的模型:
在分析阶段,需要创建概念模型。
在设计阶段,需要创建域模型和数据模型。
2.1概念模型
概念模型用来模拟问题域中的真实实体。
概念模型描述了每个实体的概念和属性,以及实体之间的关系。
概念模型并不描述实体的行为。
不管是技术人员还是非技术人员都能看得懂概念模型,他们可以很容易的提出模型中存在的问题,帮助系统分析人员及早对模型进行修改。
2.1.1购物网站应用的概念模型
•Customer和Order实体:
一对多。
一个客户有多个订单,而一个订单只能属于一个客户。
•Category和Item实体:
多对多。
一个商品类别包含多个商品,而一个商品可以属于多个商品类别。
•Order和Item实体:
多对多。
一个订单包含多个商品,而一个商品可以属于多个订单。
•Customer和ShoppingCart实体:
一对多。
一个客户有多个购物车,而一个购物车只能属于一个客户
•ShoppingCart和Item实体:
多对多。
一个购物车包含多个商品,而一个商品可以属于多个购物车。
2.1.2实体与实体之间有三种关系
◆一对多
◆一对一
◆多对多
2.2域模型
域模型是面向对象的。
在面向对象术语中,域模型也可称为设计模型。
域模型由以下内容组成:
1,具有状态和行为的域对象
2,域对象之间的关系
⏹关联
⏹依赖
⏹聚集
⏹一般化(泛化)
2.2.1关联关系
2.2.2依赖关系
在BusinessService类中访问Customer类的方法,并且构造Customer类的实例
2.2.3聚集关系
聚集指的是整体与部分之间的关系,在实体域对象之间很常见
2.2.4一般化关系
一般化指的是类之间的继承关系。
2.3域对象
域对象可以代表业务领域中的人、地点、事物或概念。
域对象分为以下几种:
●实体域对象:
业务领域的名词
●过程域对象:
业务领域的动词
●事件域对象:
业务领域中的事件
2.3.1实体域对象
●实体对象可以代表人、地点、事物或概念。
例如客户、订单、商品等作为实体域对象。
●对于J2EEWeb应用,这些名词可以作为包含状态和行为的JavaBean。
采用JavaBean形式的实体域对象也称为POJO(PlainOldJavaObject)。
●为了使实体域对象与关系数据库表中记录对应,可以为每个实体域对象分配惟一的OID(ObjectIdentifier,即对象标识符),OID是关系数据库表中的主键(通常为代理主键)在实体域对象中的等价物。
2.3.2过程域对象
●过程域对象代表应用中的业务逻辑或流程。
它们通常依赖于实体域对象。
●可以把业务领域中的动词,例如客户发出订单、登入应用等作为过程域对象。
●在J2EEWeb应用中,它们可作为常规的JavaBean,具有管理和控制应用的行为。
2.3.3事件域对象
●事件域对象代表应用中的一些事件(如异常、警告或超时)。
这些事件通常由系统中的某种行为触发。
●例如在多用户环境中,当一个客户端程序更新了某种实时数据,服务器端程序会创建一个事件域对象,其他正在浏览相同数据的客户端程序能够接受到这一事件域对象,随即同步刷新客户界面。
2.3.4域对象的持久化概念
●狭义的理解,“持久化”仅仅指把域对象永久保存到数据库中
●广义的理解,“持久化”包括和数据库相关的各种操作:
Ø保存:
把域对象永久保存到数据库中。
Ø更新:
更新数据库中域对象的状态。
Ø删除:
从数据库中删除一个域对象。
Ø加载:
根据特定的OID,把一个域对象从数据库加载到内存中。
Ø查询:
根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载到内存中。
2.4通过JDBCAPI来持久化实体域对象
●Java应用访问数据库的最直接的方式就是直接访问JDBCAPI
●java.sql包提供了JDBCAPI。
在java.sql包中常用的接口和类包括:
ØDriverManager:
驱动程序管理器,负责创建数据库连接。
ØConnection:
代表数据库连接。
ØStatement:
负责执行SQL语句。
ØPreparedStatement:
负责执行SQL语句,具有预定义SQL语句的功能。
ØResultSet:
代表SQL查询语句的查询结果集。
2.4.1JDBCAPI
2.4.2JDBC编程的缺点
●实现业务逻辑的代码和数据库访问代码掺杂在一起,使程序结构不清晰,可读性差。
●在程序代码中嵌入面向关系的SQL语句,使开发人员不能完全运用面向对象的思维来编写程序。
●业务逻辑和关系数据模型绑定,如果关系数据模型发生变化,例如修改了CUSTOMERS表的结构,那么必须手工修改程序代码中所有相关的SQL语句,这增加了维护软件的难度。
●如果程序代码中的SQL语句包含语法错误,在编译时不能检查这种错误,只有在运行时才能发现这种错误,这增加了调试程序的难度。
2.5对象—关系映射
●ORM(object—relationmapping)模式:
在单个组件中负责所有实体域对象的持久化,封装数据访问细节。
●Hibernate是ORM的一个实现
2.5.1ORM模式
2.5.2对象-关系映射(Object-RelationMapping)的概念
●ORM解决的主要问题就是对象-关系的映射。
域模型和关系模型都分别建立在概念模型的基础上。
域模型是面向对象的,而关系数据模型是面向关系的.
●一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。
2.5.3域模型与关系模型之间存在许多不匹配之处
●域模型中有继承关系,关系模型不能直接表示继承关系
●域模型中有多对多关联关系,关系模型通过连接表来表示多对多关联关系
●域模型中有双向关联关系,关系模型只有单向参照关系,而且总是many方参照one方。
●域模型提倡精粒度模型,而关系模型提倡粗粒度模型
2.5.4域模型与关系模型之间的不匹配举例
精粒度域模型和粗粒度关系模型
2.5.5通过HibernateAPI操纵数据库
3HibernateAPI简介
3.1Configuration接口
Configuration对象用于配置并且启动Hibernate.Hibernate应用通过Configuration实例指定对象-关系映射文件的位置或者动态配置Hibernate的属性.然后创建SessionFactory实例。
简单说:
配置Hibernate,启动Hibernate和创建SessionFactory对象;
3.2SessionFactory接口
一个SesssionFactory实例对应一个数据源,应用从SessionFactory中获得Session实例。
它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享
它是重量级的,这意味着不能随意创建或销毁它的实例,如果应用只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。
如果应用同时访问多个数据库,而需要为每个数据库创建一个单独的SessionFactory实例。
之所以称SessionFactory是重量级的,是因为它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数据等.用户还可以为SessionFacotry配置一个缓存插件,这个缓存插件被称为Hibernate的第二级缓存,该缓存用来存放被工作单元读过的数据,将来其他工作单元可能会重用这些数据,因为这个缓存中的数据能够被所有工作单元共享。
一个工作单元通过对应一个数据库事务。
简单说:
初始化Hibernate,充当数据存储源的代理,创建Session对象;
3.3Seission接口
Session接口是Hibernate应用使用最广泛的接口,Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加,更新,删除,加载和查询对象。
不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。
Session实例是轻量级的,所谓轻量级,是指它的创建和销毁不需要消耗太多资源,这意味着在程序中可以经常创建或销毁Session对象.Session有一个缓存,被称为Hibernate的第一级缓存,它存放被当前工作单元加载的对象。
每个Session实例都有自己的缓存,这个Session实例的缓存只能被当前工作单元访问。
负责保存,更新,删除,加载和查询对象;
3.4Transaction接口
Transaction接口是hibernate的数据库事务接口,它对底层的事务接口做了封装,底层事务接口包括JDBCAPI,JTA,CORBA。
3.5Query和Criteria接口
Query和Criteria接口是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。
Query实例包装了一个HQL(HibernateQueryLanguage)查询语句,HQL查询语句与SQL查询语句有些相似,但HQL查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。
Criteria接口完全封装了基于字符串形式的查询语句比Query接口更加面向对象,Criteria接口擅长于执行动态查询。
3.6回调接口
一个对象发生了特定的事件,例如对象被加载,保存,更新或删除,Hibernate应用可以通过回调接口来响应这一事件。
回调接口按实现方式可分为两类:
Lifecycle和Validatable接口:
由持久化类来实现这两个接口。
Lifecycle接口使持久化类的实例能响应被加载,保存或删除的事件。
Validatable接口使持久化类的实例在被保存之前进行数据验证这种方式强迫持久化类必须实现Hibernate的特定接口,使HibernateAIP渗透到持久化类中,会影响持久化的的可移植性,因此不值得推荐。
Interceptor接口:
不必由持久化类来实现Interceptor接口。
应用程序可以定义专门实现Interceptor接口的类,Interceptor实现类负责响应持久化类的实例被加载,保存,更新或删除的事件。
3.7hibernate映射类型接口
Type接口提供了各种实现类,它们代表具体的Hibernate映射类型。
口表示Hibernate映射类型,用于把域对象映射为数据库关系数据.Hibernate为Type接。
3.8可扩展借口
⏹制主键的生成策略:
IdentifierGenerator接口
⏹定制本地SQL方言:
Dialect抽象类
⏹定制缓存机制:
Cache和CacheProvider接口
⏹定制事务管理:
TransactionFactory,Transaction和TransactionManagerLookup接口
⏹定制ORM策略:
ClassPersister接口
⏹定制属性访问策略:
PropertyAccessor接口
⏹创建代理:
ProxyFactory接口
⏹制定客户化映射类型:
UserType和CompositeUserType接口
4Hibernate的映射类型
Hibernate映射类型分为两种:
内置映射类型和客户化映射类型。
内置映射类型负责把一些常见的Java类型映射到相应的SQL类型;此外,Hibernate还允许用户实现UserType或CompositeUserType接口,来灵活地定制客户化映射类型。
客户化类型能够把用户定义的Java类型映射到数据库表的相应字段。
4.1Hibernate的内置映射类型
∙Java基本类型的Hibernate映射类型
Hibernate映射类型
Java类型
标准SQL类型
大小和取值范围
integer或者int
int或者java.lang.Integer
INTEGER
4字节
long
long Long
BIGINT
8字节
short
short Short
SMALLINT
2字节
byte
byte Byte
TINYINT
1字节
float
float Float
FLOAT
4字节
double
double Double
DOUBLE
8字节
big_decimal
java.math.BigDecimal
NUMERIC
NUMERIC(8,2)8位
character
char Character String
CHAR
(1)
定长字符
string
String
VARCHAR
变长字符串
boolean
boolean Boolean
BIT
布尔类型
yes_no
boolean Boolean
CHAR
(1)(Y-N)
布尔类型
true_false
boolean Boolean
CHAR
(1)(T-F)
布尔类型
∙ Java时间和日期类型的Hibernate映射
映射类型
Java类型
标准SQL类型
描述
date
util.Date或者sql.Date
DATE
YYYY-MM-DD
time
Date Time
TIME
HH:
MM:
SS
timestamp
Date Timestamp
TIMESTAMP
YYYYMMDDHHMMSS
calendar
calendar
TIMESTAMP
YYYYMMDDHHMMSS
calendar_date
calendar
DATE
YYYY-MM-DD
∙ Java大对象类型的Hibernate映射类型
映射类型
Java类型
标准SQL类型
MySQL类型
Oracle类型
binary
byte[]
VARBINARY(或BLOB)
BLOB
BLOB
text
String
CLOB
TEXT
CLOB
serializable
Serializable接口任意实现类
VARBINARY(或BLOB)
BLOB
BLOB
clob
java.sql.Clob
CLOB
TEXT
CLOB
blob
java.sql.Blob
BLOB
BLOB
BLOB
在程序中通过Hibernate来保存java.sql.Clob或者java.sql.Blob实时,必须包含两个步骤:
在一个数据库事务中先保存一个空的Blob或Clob实例。
接着锁定这条记录,更新上面保存的Blob或Clob实例,把二进制数据或文本数据写到Blob或Clob实例中。
4.2客户化映射类型
待补充
5三种状态
5.1Hibernate三种状态
⏹临时状态(Transient):
刚刚用new创建的对象,它没有被持久化,没有处于Session中,处于此状态的对象叫临时对象;
⏹持久化状态(Persistent):
已经持久化,加入到了Session缓存中。
处于此状态的对象叫持久对象;
⏹游离状态(Detached):
已经持久化,但不在Session缓存中。
处于此状态的对象叫游离对象;
5.2Customer对象状态转移过程示例
程序代码
Customer对象生命周期
Customer对象的状态
tx=session.beginTransaction();
Customerc1=newCustomer(“Learncy”,newHashSet());
开始生命周期
临时状态
Session.save(c1);
处于生命周期
转变为持久状态
Longid=c1.getId();
c1=null;
Customerc2=(Customer)session.load(Customer.class,id);
mit();
处于生命周期
处于持久状态
Session.close();
处于生命周期
转变为游离态
System.out.println(c2.getName);
处于生命周期
处于游离态
c2=null;
结束生命周期
结束生命周期
5.3三种对象之间的迁移图
5.4临时态特征
⏹不处于Session的缓存中,也可以说,不被任何一个Session实例关联。
⏹在数据中没有对应的记录。
在以下情况,Java对象进入临时状态:
Ø当通过new语句刚创建一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
ØSession的delete()方法能使一个持久化对象或者游离态对象转变为临时对象。
对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。
5.5持久化对象特征
⏹位于一个Session实例的缓存中。
5.6游离对象特征
⏹不再位于Session的缓存中,也可以说,不被任何一个Session实例关联。
⏹游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录。
游离态与临时态的区别是:
游离态是持久化对象转变过来的。
以下情况使持久化对象转为游离对象:
Ø当调用Session的close()方法时,缓存中所有持久化对象都变为游离对象。
ØSession的evict()方法能够从缓存中删除一个持久化对象,使它变成游离态对象。
6Hibernate缓存
6.1缓存概述
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。
缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
缓存的介质一般是内存,所以读写速度很快。
但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。
缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。
6.2Hibernate缓存
Hibernate的缓存包括Session的缓存和SessionFactory的缓存。
SessionFactory的缓存又可以分为两类:
内置缓存和外置缓存。
Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。
SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。
SessionFactory的外置缓存是一个可配置的插件。
在默认情况下,SessionFactory不会启用这个插件。
外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。
SessionFactory的外置缓存也被称为Hibernate的第二级缓存。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 培训