Hibernate持久化类、主键生成策略、持久户对象、一级缓存、事务和五种检索方式

来源:互联网 发布:邮政网络培训学院官网 编辑:程序博客网 时间:2024/05/20 14:41

持久化类:

javabean+映射文件

持久化类的编写规范:

必须有一个无参构造器

字段必须私有且提供公共的访问方法

类中必须有一个属性(OID)和表中的主键对应

尽量属性字段使用包装类修饰

尽量不要使用final修饰类

 

 

主键生成策略:

主键分类:

自然主键:使用表中一个有意义的字段作为主键.

★代理主键:为这张表添加一个字段,没有任何业务意义,只是作为唯一标识存在.

hibernate的主键生成策略:

increment:使用的hibernate的自增策略,插入记录之前先查询表中的最大id,然后将id+1,作为该条记录 的id.仅适用于单线程

identity:使用的数据库底层的自增策略,类型为整数,例如:mysql

sequence:使用的数据库底层的序列策略,类型为整数,例如:oracle

★native:使用的是本地数据库的策略,类型为整数,可以认为不是identity就是sequence

★uuid:使用的是唯一的字符串

assigned:放弃hibernate维护主键,手动的设置oid

 

 

持久化对象:

三种状态:

瞬时态:没有oid且没有被session管理

★持久态:有oid且被session管理

脱管态:有oid但没有被session管理

三种状态的转换

瞬时态

获取:

通过new 

转换:

瞬时态-->持久态

调用save()或者saveOrUpdate()

瞬时态-->脱管态

可以认为给对象设置了一个oid setId()

持久态

获取:

调用 get或者load或者其他的查询

转换:

持久态-->瞬时态

调用session.delete()

持久态-->脱管态

调用session的 close()或者 clear() 或者 evict(obj)

脱管态

获取:

我们可以认为 

创建一个对象,设置一个oid

转换:

脱管态-->持久态

调用session的update()或者saveOrUpdate()

脱管态-->瞬时态

可以认为将对象的oid设置为null

注意:★

持久态对象可以自动更新数据库.(依赖于hibernate的一级缓存)

 

 

一级缓存:

缓存:

介于应用程序和硬件之间的一个桥梁.

作用:减少对硬件的访问.

hibernate是一个封装了jdbc的框架.所以效率没有jdbc高,为了提高效率,hibernate提供了一系列的优 化策略,例如:缓存.

hibernate的一级缓存依赖的java中集合.

一级缓存中主要分成两块区域,一块叫做缓存区,一块叫做快照区.

hibernate中获取对象的时候,优先从缓存中查找

若找到:直接返回

若找不到:去数据库中查询,查询到之后放入缓存中一份.

当执行保存或者更新操作的时候,也会放入缓存中一份.

★放入缓存中数据,其实放入缓存区一份,也放入快照区一份.

操作的时候,操作的缓存区中的数据.

当事务提交的时候,对比缓存区中数据和快照区中数据是否一致

 若一致:啥都不做

 若不一致:会发送update语句

 

扩展:

一级缓存,hibernate自带的,不能卸载.生命周期和session的生命周期一致,称之为session级别的缓存

二级缓存,不是hibernate自带的.需要配置才能使用(ehcache).一般使用redis替代.

生命周期和sessionFactory生命周期一样,所以也称之为sesssionFactory级别的缓存.

 

 

事务:

事务就是一件完整的事情.可以包含多个操作单元,这些操作单元要么全部成功,要么全部失败.

事务的特性:

Atomicity、Consistency、Isolation、Durability

原子性:事务不可分割

一致性:事务执行前后的业务状态要和其他的业务状态一致.

隔离性:将每个事务隔离起来.尽量不受其他事务干扰

持久性:事务一旦提交,终将要保存到数据库中. 

不考虑隔离性会产生的问题:

脏读

不可重复读 两次查询的结果 针对于update

虚读 两次查询的结果 针对于insert

可以通过设置事务的隔离级别避免问题:

1 read uncommited 读未提交,什么都不能避免

2 read commited 读已提交,避免脏读(oracle默认)

4 repeatable read 可重复读,避免脏读和不可重复读(mysql默认)

8 serializable     串行化,可以避免所有问题

hibernate中的隔离级别:

只需要在核心配置文件中配置

4</>

事务控制:

事务加载service层.必须使用连接对象.如何保证service层和dao层在同一个事务中.

只需要保证他们使用的是同一个连接.如何保证呢:

方式1:向下传递连接

★方式2:使用★ThreadLocal(将连接和当前的线程绑定)

hibernate中事务控制:

hibernate只是对connection的事务进行了封装.

若想使用手动控制事务,hibernate封装了线程绑定session的方式

使用当前线程中的session

1.配置核心文件

thread

2.就可以在java中通过

factory.getCurrentSession()获取了

注意:

若使用getCurrentSession方法,session对象不需要手动关闭.

 

 

5种检索方式:

1.oid检索(get和load)

2.对象导航:当配置了级联时,对象内会保存有级联的对象信息

3.hql检索

面向对象.

hql语句中不能出现表名和字段名.hql语句和sql语句很相似.

获取Query对象

session.createQuery(hql语句);

例如:

session.createQuery("from 类名")

方法:

list()

分页:

setFirstResult(开始的索引)

setMaxResults(每页显示的条数)

条件:hql和sql写法类型

设置参数:setParameter(int 问号索引,object 值);

唯一:

uniqueResult();

4.qbc检索

query by criteria

更加面向对象.看不到sql的影子.全部是方法

获取Criteria对象

session.createCriteria(Class);

方法:

所有:

list()

唯一:

uniqueResult()

分页:

setFirstResult(开始的索引)

setMaxResults(每页显示的条数)

条件:

add(Restrictions.eq | lt | gt | in | like("属性名",值));

 

5.sql检索

获取SqlQuery:

session.createSqlQuery(sql语句)

 

将每条记录封装成指定的实体

addEntity(class)

 

 

 

 

 

待续……

0 0
原创粉丝点击