hibernate对象的三种状态以及加载策略.附加一级缓存讲解 和 并发控制

xiaoxiao2022-05-13  14

1. 对象的三种状态(hibernate管理的对象) 1.1 临时状态 (new delete) 1.2 持久状态(get save update) 1.3 游离状态 (close)

注意: 1、hibernate通过管理对象来操作数据库,这里对象指的是持久态的对 象 2、各种状态的对象是可以相互转换

2. 一级缓存、快照(orm特性:对象 关系 映射)对象改变数据就改变

一级缓存讲解

1.一级缓存又称为session级别的缓存 ,相当于数据库中的某一条数据在hibernate中产生一个快照(保存当时状态),并且将值封装进对象

2.对象如果发生了改变,那么它会与之前的hibernate中的快照进行对比(不是与数据库中数据对比),如果不一致,那么将会修改数据库中的数据.

3. 加载策略 3.1 立即加载 get 是立即加载

3.2 延迟加载 load是懒加载(延时加载) * 什么是懒加载? 将查询的oid(object id(用来标识唯一的对象))保存到session的代理proxy 中,当要真正的用到查询的对象的时候,再去执行查询的sql语句 * */

package com.zking.three.dao; import org.hibernate.Session; import org.hibernate.Transaction; import com.zking.one.entity.User; import com.zking.two.entity.Student; import com.zking.two.util.SessionFactoryUtil; public class UserDao { /** * get 是立即加载 * @param user * @return */ public User getUser(User user) { Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); System.out.println(123); User u=session.get(User.class, user.getId()); System.out.println(456); System.out.println(u.getUserName()); transaction.commit(); SessionFactoryUtil.closeSession(); return u; // 123 sql语句 456 张翊晗 } /**load是懒加载(延时加载) * * could not initialize proxy(代理) -因为 no Session * 懒加载问题:(性能更优) * 什么是懒加载? * 将查询的oid(object id(用来标识唯一的对象))保存到session的代理proxy 中,当要真正的用到查询的对象的时候,再去执行查询的sql语句 * */ public User loadUser(User user) { Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); System.out.println(123); User u=session.load(User.class, user.getId()); System.out.println(456); System.out.println(u.getUserName());//要用查询的对象了 , 返回去调sql语句 transaction.commit(); SessionFactoryUtil.closeSession(); return u; // 123 456 sql语句 张翊晗 } }

测试 *

4. 并发控制 在表中追加一个用于版本控制的字段version , 该字段会伴随着每次修改而改变, 假如同时有两个线程修改数据库, 则第二个修改的那个线程一定会发现数据库中的版本发生了改变, 此时就会抛异常, 程序就可以捕捉到该异常, 从而使其再次发出请求, 而用户是不会感知到的.

实体类

映射文件

注意: 此时version标签一定要在property标签之前

测试

/** * 并发控制 */ @Test public void testUpdateStudent() { Student student=new Student(); student.setSid(2); student.setVersion(1);//bb student.setSname("bbbcc"); this.userDao.updateStudent(student);//bbbb //修改id=2,vession=1 (sname=bb) 的sname=bbbb 修改后 sname=bbbb version+1 =2; //修改后 再次执行此方法修改不了 因为vsersion=2了. }
转载请注明原文地址: https://www.6miu.com/read-4884177.html

最新回复(0)