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

注意: 1、hibernate通过管理对象来操作数据库,这里对象指的是持久态的对

2、各种状态的对象是可以相互转换
hibernate对象的三种状态以及加载策略 .附加一级缓存讲解 和 并发控制

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

一级缓存讲解

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

  • 2.对象如果发生了改变,那么它会与之前的hibernate中的快照进行对比(不是与数据库中数据对比),如果不一致,那么将会修改数据库中的数据.
    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语句   张翊晗
	 
    		}
	 }
	 

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

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

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

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

注意: 此时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了.



}

相关文章:

  • 2022-01-08
  • 2021-09-06
  • 2021-07-11
  • 2021-07-06
  • 2021-11-10
  • 2021-04-26
猜你喜欢
  • 2021-08-14
  • 2021-12-05
  • 2021-05-20
  • 2021-11-27
  • 2022-01-18
  • 2021-05-16
  • 2021-05-10
相关资源
相似解决方案