Spring学习之(Hibernate)Session接口

  1. Session接口是非线程安全的,要避免多线程操作,一般执行CRUD操作;
  2. Session对象的获得方法:
Session sesion = sessionFactory.openSession();
Session sesion = sessionFactory.getCurrentSession();
(注:Session对象获取后,不会立刻获取Connection对象,而是在Session对象需要对数据库进行操作时才会从数据库连接池中获取Connection对象。而关闭Session对象时,不会直接关闭Connection,而是将Connection对象返回到连接池中。)

Session接口用于进行CRUD操作的方法
Java对象在hibernate持久化层的状态:
临时态:不被session关联,在数据库中没有相应的记录
持久态:被session关联,在数据库中有对应的记录
删除态:不被session关联,并且session已经计划从数据库中删除
游离态:不被session关联,在数据库中有对应的记录

(一)get(Class clazz, Serializable id)

首先根据id在session缓存(一级缓存)查询,没有的话查询二级缓存,最后查询数据库,查不到就返回null。

(二)load(Class theClass, Serializable id)

此方法默认认定id对应的对象(数据库记录)在数据库中是一定存在的,如果数据库中不存在该记录,则抛出异常。

首先根据id在session缓存(一级缓存)查询,没有的话查询数据库,查不到就抛出异常。

(三)save(Object object)

用来保存持久化对象,即在数据库中新增记录。

(四)saveOrUpdate(object);

根据对象的状态(临时,持久,托管)对对象进行save或update操作。

当对象的状态为临时状态时,对对象进行save操作
当对象的状态为持久或托管状态时,对对象进行update操作

(五)update(Object object)

使一个游离对象转变为持久化对象。

Session只有在清理缓存的时候才执行update语句,并且在执行的时候才会把对象的当前属性封装到update语句中,因此程序多次修改对象的属性,在清理缓存的时候只会执行一次update语句。

用update()关联一个对象的时候,若缓存中已经存在了同类型并且OID相同的对象,就会报错,应该改用merge()。

(六)delete(Object object)

删除游离态对象或是持久态对象,若删除的是游离态对象,先将对象变为持久态。

使用delete()方法删除数据库表中的一条记录,首先要通过该对象的get()或者load()方法获取要删除记录对应的持久化对象,然后通过delete()方法删除。

(七)merge(Object object)

将一个游离对象的属性复制到一个持久化对象中。其处理流程如下:
(1)根据游离对象的id到Session缓存中查找匹配的持久化对象。若找到匹配的持久化对象,则将游离对象的属性复制到持久化对象中,计划实行一条update语句,然后返回持久化对象的引用。
(2)如果在Session的缓存中没有找到与游离对象id一致的持久化对象,那么就试图根据该id从数据库中加载持久化对象。如果数据库中存在匹配的持久化对象,则将游离对象的属性复制到刚加载的持久化对象中,计划实行一条update语句,然后返回持久化对象的引用。
(3)如果数据库中也不存在或者对象是临时对象时,则会新建一个对象,将属性赋值到该新建对象中,再持久化新建对象,最后返回新建对象的引用。

merge()执行后,该对象状态为游离态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值