Hibernate之Session

Session介绍

①核心API
Session对象是Hibernate开发操作中最核心的API
Session对象提供了基本的保存、更新、删除和加载JavaBean对象的方法
注意:session对象只能“加载”JavaBean对象,因为真正的查询方法需要使用其他API(Query对象)来实现

②Session缓存
Hibernate还为Session提供了缓存机制
Session通过一系列集合结构实现了一级缓存
存放在缓存中的JavaBean对象称之为“持久化对象”
Session会根据缓存中的对象状态,适时的发送SQL语句,

保证缓存中对象的属性值和数据库中表记录的字段值保持一致


Session还有具有缓存机制,位于缓存中的对象称之为“持久化对象”
Session会根据某个特定的时间点,按照缓存中对象的变化执行特定的SQL语句,同步更新数据库
这一过程称之为“刷新缓存”(flush)
从持久化的角度来看,Hibernate将JavaBean对象划分为4种状态:

持久态、临时态、游离态、删除态,这四种状态的判断核心就是这个JavaBean是否存在于Session的缓存当中

临时状态:一个JavaBean对象被创建出来,但是还没有被保存到数据库当中,始终处于内存当中
                  此时这个JavaBean对象并不处于Session的缓存中
                  临时状态对象的主键值(OID)通常为null(OID由数据库产生)
持久状态:一个JavaBean被创建出来并通过保存方法保存到数据库当中形成记录,是否提交事务不重要
                  此时这个JavaBean对象已经存在于Session的缓存当中
                  同时,从数据库中查询出来的、有一条记录与之对应的JavaBean对象,也属于持久化状态
                  持久化对象的OID不为null
                  持久化对象与数据库中存在的一条记录相对应
                  在同一个Session中,一条数据库记录只能和一个持久化对象相对应
                  Session在执行flush()的时候会自动根据持久化对象的属性变化,同步更新数据库
游离状态:一个JavaBean已经被持久化,但是已经不再处于Session的缓存当中,
                此时称这个JavaBean对象处于游离状态
                处于游离状态的JavaBean对象可以通过重新加入Session缓存,回到持久化状态
                游离状态的对象OID不为null
删除状态:一个JavaBean已经不处于Session的缓存当中,
                且Session已经计划将这个JavaBean对象对应的数据库记录删除
                此时这个JavaBean对象处于删除状态

                一般情况下程序不应该再使用删除对象

①临时状态 -> 持久状态:
将一个处于临时状态的对象转换为持久化状态
可以简单的理解为:将一个新new的对象保存到数据库当中
Session为我们提供了save()、saveOrUpdate()、lock()、persist()、merge()等方法
(1).save()方法:
作用:用来将一个临时对象转换为持久对象,
或者说是将一个JavaBean对象对应的属性值保存到数据库当中形成一条记录
特点:
    1.使一个临时对象变为持久化对象
    2.为持久化对象分配OID(主键值)
    3.在flush()方法执行时会发送一条insert语句
    4.在save()方法之前为JavaBean设定的OID值是无效的,会被覆盖掉
    5.持久化对象的OID值是不能被修改的,否则会报错
(2).persist()方法:
作用:同样是能够将一个临时对象转换为持久化对象
与save()方法之间的区别:
    在persist()方法中,如果事先为JavaBean对象指定OID值
    那么在执行insert的时候将会抛出异常,不执行insert
    而不是像save()方法那样覆盖这个OID的值


②初始化状态 -> 持久状态:
如果一个对象从加入虚拟机内存的时候开始,就已经处于持久化状态
那么这个对象一定是从数据库中查询得到的
如果想要从数据库中通过Session加载一个对象到一级缓存中

那么可以使用get()方法或者load()方法

两个方法的使用异同:
相同点:
    通过get()方法或者load()方法,都能够按照OID从数据库中查询一条记录
    将这条记录转换为JavaBean对象,并加入一级缓存中成为持久化对象
不同点:
    1.加载方式的不同:
       get()方法在调用的时候会立即查询数据库,直接得到一个JavaBean对象
       load()方法在调用的时候并不会直接访问数据库,得到JavaBean对象
       而是返回一个代理对象,这个代理对象中只有OID属性值,没有其他属性的属性值
       其他属性的属性值需要在调用这个对象的具体属性,或者直接使用这个对象的时候才会被从数据库中加载出来
       简而言之:get()方法是立即加载,load()方法是延迟加载

    2.对Session关闭的不同反应:
       因为get()方法是直接从数据库中将数据内容查询出来,放在内存中的JavaBean对象中
       所以,即使因为Session关闭了,通过get()方法获取的JavaBean对象依然是可以可直接使用的
       但是load()方法一开始返回的是一个代理对象,在使用这个代理对象的时候,可能会涉及到再次加载对象属性的问题
       如果在使用通过load()方法得到的代理对象访问元素属性的时候,Hibernate会再次访问数据库加载对象属性
       此时如果负责和数据库交互的Session对象已经关闭(执行close()方法)
       那么将会抛出异常:LazyInitiallizationException
       如果只是单纯的调用load()方法,而不使用这个对象或者访问这个对象的属性
       那么即使Session已经关闭,也不会出现这个异常

    3.对应没有记录问题方式的不同:
       如果在数据库中,没有查询相应的记录时:
       get()方法将会直接返回null对象
       load()方法则是根据情况进行判断:
            如果只是单纯的使用load()方法加载一个对象,那么将不会出现问题
            如果是使用这个对象或者访问这个对象的属性,那么Hibernate将会抛出异常

③游离状态 -> 持久状态:
游离状态的对象只能够通过持久化状态的对象转化而来:
一个JavaBean对象,原先存在于Session的缓存当中,处于持久化状态下
在这个状态下,如果Session关闭或者清空一级缓存
那么其中保存的JavaBean对象将处于游离状态
处于游离状态下的JavaBean对象,既是通过set方法修改其中的属性值
Session也不会再发送相应的update语句去更新数据库中的数据
因为此时的JavaBean对象已经不再归当前的Session管辖
如果想让这个JavaBean对象回到持久化状态,那么需要使用Session调用update方法
手动更新这个JavaBean中的属性值到数据库当中
而且需要注意的是:不论通过update方法更新的JavaBean对象中的属性值和数据库中的记录值是否一致
Hibernate都会发出update语句
注意1:如果数据表中没有对应的记录,但还是调用了update方法,将会抛出异常
注意2:当update方法关联一个游离对象的时候,如果Session的缓存中已经存在了一个相同OID的对象
此时将会抛出异常:因为在同一个Session缓存中不能同时关联两个具有相同OID的对象

④持久状态 -> 删除状态:
Session提供的delete方法,不论是游离对象还是持久化对象,都可以进行删除
前提是这个对象中保存的OID在数据库当中对应一条记录
如果被删除对象的OID在数据库当中并没有对应记录的话
删除方法将会抛出异常
还有值得注意的是:在调用delete方法之后,Hibernate并不会直接发送delete语句
而是等到Session执行flush操作的时候,才会发出删除语句执行删除
也就是说,delete方法的作用就是计划执行删除

⑤补充部分:
(1).saveOrUpdate()方法:
这个方法集合了save()方法和update()方法的功能
但是到底什么时候执行save()方法,什么时候执行update()方法呢?
如果对象的OID为空(临时对象),执行save()方法,提交ineert语句
如果对象的OID不为空(游离对象),执行update()方法,提交update语句
如果对象的OID不为空,而数据库中没有相关记录,则抛出异常

(2).evict()方法:
Session提供的evict方法可以将指定的JavaBean对象从Session的缓存中删除
这个方法和clear()方法不同:
    clear()方法是清空缓存空间,删除其中所有的持久化对象
    evict()方法则是仅删除其中指定的持久化对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值