Hibernate学习笔记

一、三层架构数据库 层、业务逻辑层、UI层)

优点:

开发快捷,易于维护,主要针对小型系统应用

缺点:

(1)访问数据库操作 与业务逻辑操作纠缠在一起,不利于分层开发和维护。

(2)大量操作数据库的代码以及一些业务逻辑代码会多次重复。

二、四层架构(数据库层、持久化层、业务逻辑层、UI层)

优点:

(1)可以分层开发,访问数据库与业务逻辑实现能够分开。

(2)提高代码的复用。

缺点:

(1)对设计人员要求较高

(2)不利于调试

三、引入Hibernate 的应用

经过对Hibernate的二次封装,能够较快的集成到用户系统中。实现关系数据模型到对象数据模型的转变。

四、实体域对象的持久化模式

ORM模式:数据模型描述与数据访问细节分开,类似于四层架构

主动域对象模式:数据模型描述与数据访问细节放到了一起,类似于三层架构

JDO模式:是Sun公司制定的描述对象持久化语义的标准API

CMP模式:由容器管理实体的持久化

五、术语

域对象:实体域对象、过程域对象、事件域对象

域对象的关系:关联、依赖、聚集、一般化

关联:类之间的引用关系

依赖:类之间的访问关系,过程域对象的实现要依赖于实体域对象

聚集:整体与部分之间的关系

一般化:类之间的继承关系

关联与聚集的区别:

关联的对象是可以独立存在的,而聚集中的一方要依赖于另一方才有存在价值

Hibernate检索策略:

立即检索、延迟检索、迫切左外连接检索

Hibernate检索策略应用对象级别

类级别、关联级别

以下表格为类级别和关联级别可选的检索策略及默认的检索策略

 

检索策略的作用域

可选的检索策略

默认的检索策略

运行时行为受影响的Session的检索方法

类级别

立即加载

延迟加载

立即检索

Load()方法

关联级别

立即加载

延迟加载

迫切左外连接检索

多对一或者一对一为迫切左外连接检索

一对多或者多对多为立即检索

Get()、Load()、Find()方法

以下表格为用于在对象-关系映射文件中设定检索策略的属性

 

属性

可选值

默认值

描述

lazy

true、false

false

如果为true表示使用延迟加载,如果为false表示使用立即加载

outer-join

auto、true、false

在<many-to-one>元素和

<one-to-one>元素中为auto,在<one-to-many>元素和<many-to-many>元素中为false

如果为true表示使用迫切左外连接检索。在<many-to-one>、<one-to-one>、和<set>元素中包含此属性

如果为false表示使用立即加载

batch-size

正整数

1

设定批量检索的数量。如果设定此项合理的取值在3-10之间

一、类级别的检索策略:

Session的Load()、Get()、Find()方法受到检索策略的影响

Load()方法的立即检索:立即查询数据库 并初始化类实例,查询不到是抛异常

Load()方法的延迟检索:不检索数据库只返回类的代理实例,举例说明一个Custom类

当Custom类通过Session.Load()方法延迟加载持久化对象时,只是将 Custom对象的对象标识赋值,并没有操作数据库;当我们访问这个对象的标识属性时也只是简单返回对象标识,并不操作数据库。而当我们访问Custom 对象的其它属性时由于没有初始化,所以要检索数据库并赋值给该属性。这个时候要保证此对象的Session连接时正常的。

Get()方法的检索策略:只有立即加载策略。查询不到返回null

Find()方法的检索策略:只有立即加载策略。

如果我们在使用Session的Load()、Get()、Find()方法时并不知道检索策略,我们可以在调用这些方法后立即执行以下代码来初始化持久化对象:

If( !Hibernate.isInitialized(customer))

{

         Hibernate.initialize(customer);

}

二、关联级别的检索策略

一对多和多对多关联的检索策略

 

lazy属性

outer-join属性

检索策略

false

false

采用立即检索,这是默认的检索策略,当使用Hibernate的第二级缓存 时,可以考虑采用立即检索。

true

false

采用延迟检索

false

true

采用迫切左外连接检索,对于Hibernate2.0以下,再映射文件中如果有多个<set>元素,只允许有一个<set>元素的outer-join属性为true

true

true

没有任何意义

注意:对于Session.find()方法会忽略迫切左外连接检索,采用立即检索策略

多对一和一对一关联的检索策略

Order对象与Custom对象之间的多对一关系

 

Order.hbml.xml的

<many-to-one>元素的

outer-join属性

Custom.hbm.xml的<class>元素的lazy属性

检索order对象时对关联的custom对象使用的检索策略

auto

true

延迟检索

auto

false

迫切左外连接检索

true

true

迫切左外连接检索

true

false

迫切左外连接检索

false

true

延迟检索

false

false

立即检索

批量检索:

设置<class>元素的batch-size,这样再进行查询时能够在Sql中采用or连接词,减少查询次数。

一、提高查询性能:

1、尽量使用迫切连接,以减少查询数据库 的次数。

2、对使用延迟加载或者立即检索策略设置批量 查询数目,以检索查询数据库的次数。

3、使用查询缓存

4、有的时候数据量较大,只负责显示的数据可使用Sql查询,以减少缓存空间。

5、尽量减少返回记录集字段的数目,只返回所需要的字段。

6、使用集合过滤,也就是说通过第一次查询的结果来再次进行查询。

二、HQL方式与QBC方式的不同

1、HQL方式功能强大,可实现分组,外连、内连,而QBC则没有这些功能。

2、HQL语句写法接近Sql语句方式,容易上手。

3、HQL语句无法在编译期检查错误。而QBC能够做到。

4、QBC是面向对象的,而HQL语句还不是面向对象编程。

5、QBC能够动态创建查询,而HQL不能

6、QBC提供了接口,扩展性好,HQL方式不具有扩展性。

三、本地SQL的写法

sql = select c.Name as {cs.name},c.Code as {cs.code} from customer as c where cs.Name

select  表别名.字段名 as {类别名.字段别名}, 表别名.字段名 as {类别名.字段别名} from 表名 as 表别名 where 表别名.字段名

Query query = sesion.createSQLQuery(sql,"c",Customers.Class);

Query query = sesion.createSQLQuery(sql,类别名,类的类型);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值