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

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了.



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值