Hibernate框架

来源:互联网 发布:新建视图 sql语句 编辑:程序博客网 时间:2024/06/11 14:47

一、 概述

ORM :Object Relation Mapping 对象关系映射。

Hibernate:开放源代码的ORM框架,对JDBC进行了轻量级的对象封装。

Crud :增删改Create、Retrieve、Update、Delete

主要被用在描述软件系统中数据库或者持久层的基本操作功能。

Session :是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。Session接口负责执行被持久化对象的crud操作,线程不安全。

OID:Object identifier, OID对象标识符,OID字段即主键

JTA:即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。一个分布式事务(distributedtransaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。

QBC:Query By Criteria

JPA:Java Persistence API。是SUN公司推出的一套基于ORM的规范。hibernate框架中提供了JPA的实现。JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

二、

1、在使用Hibernate时,首先要创建Configuration实例,Configuration实例主要用于启动、加载、管理hibernate的配置文件信息。

2、SessionFactory接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的的数据放在这个缓冲区中。线程安全

3、SessionFactory内置了一个连接池,hibernate.connection.provider_class

 

三、get和load的区别

1、查询的时机不一样

              get方法任何时候都是立即加载,即只要一调用get马上发起数据库查询

              load方法默认情况下是延迟加载,即真正用到对象的非OID字段数据才发起查询

              load方法可以通过配置的方式改为立即加载。

              配置的方式:

             由于load方法是hibernate的方法所以只有XML的方式:

            <classname="Customer" table="cst_customer"lazy="false">            

2、返回的结果不一样

              get方法永远返回查询的实体类对象。

              load方法当是延迟加载时,返回的是实体类的代理对象。

 

四、Hibernate的一级缓存

就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行查找,如果找到匹配OID值的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库;如果没有找到相同OID值的对象,则会去数据库中查找相应数据。当从数据库中查询到所需数据时,该数据信息也会放置到一级缓存中。Hibernate的一级缓存的作用就是减少对数据库的访问次数。

Hibernate 向一级缓存放入数据时,同时复制一份数据放入到Hibernate快照中,当使用commit()方法提交事务时,同时会清理Session的一级缓存,这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库,并更新快照;如果一致,则不执行update语句。

Hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致。

五、对象的三种状态

1、 瞬时态(transient)

不存在持久化标识OID(相当于主键值),尚未与Hibernate Session关联

2、 持久态(persistent)

存在持久化标识OID ,加入到了Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录

3、 脱管态(detached)

脱管态对象存在持久化标识OID,并且仍然与数据库中的数据存在关联,只是失去了与当前Session的关联

 

六、

短语

含义

Restrictions.eq

等于=

Restrictions.allEq

使用Map,使用key/value进行多个等于的判断

Restrictions.gt

大于>

Restrictions.ge

大于等于>=

Restrictions.lt

小于<

Restrictions.le

小于等于<=

Restrictions.between

对应sql的between子句

Restrictions.like

对应sql的like子句

Restrictions.in

对应sql的in子句

Restrictions.and

and 关系

Restrictions.or

or关系

Restrictions.sqlRestriction

Sql限定查询

Restrictions.asc()

根据传入的字段进行升序排序

Restrictions.desc()

根据传入的字段进行降序排序


运算类型

HQL运算符

QBC运算方法

比较运算

=

Restrictions.eq()

<> 

Restrictions.not(Restrictions.eq())

>=

Restrictions.ge()

Restrictions.lt()

<=

Restrictions.le()

is null

Restrictions.isNull()

is not null

Restrictions.isNotNull()







范围运算符

in

Restrictions.in()

not in

Restrictions.not(Restrictions.in())

between

Restrictions.between()

not between

Restrictions.not(Restrictions.between())

HQL运算符

QBC运算方法

like

Restrictions.like()

and

Restrictions.and()|

Restrictions.conjunction()

or

Restrictions.or()|

Restrictions.disjunction()

not

Restrictions.not()