hibernate的加载策略及可能出现的问题

重点:

  1. 对象的三种状态(hibernate管理的对象);
  2. 一级缓存、快照(orm特性);
  3. 加载策略;
  4. 并发控制;
  5. 在写代码中出现的错误解决;

重点解析:

  1. 对象的三种状态(hibernate管理的对象)
    1.1 临时状态
    1.2 持久状态
    1.3 游离状态
    在这里插入图片描述

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

代码分析

Configuration configure = new Configuration().configure("hibernate.cfg.xml");
		SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		User user = new User();
		user.setId(6);
		user.setUserPwd("134674");
		//将临时状态改变为持久状态
		session.save(user);
		User u = session.get(User.class, user.getId());
		//将持久状态转换我临时状态
		session.delete(u);
		u.setUserName("胡玥婷");
		//将状态转换成游离状态
		session.close();
		transaction.commit();

2.一级缓存、快照(orm特性)
2.1 、
简介:一级缓存又称我session级别的缓存

  • 1、 相当于数据库中的某一条数据在hibernate中产生一个快照,并且将至封装进对象
  • 2、user 如果说发生了改变,那么它会与之间的hibernate中的快照进行对比,如果说不一致,那么就会修改数据库中的数据

u = {1 ww 20 2018-5-3 abcd} --> u = {1 qq 17 null xyz}
u’ = {1 ww 20 2018-5-3 abcd}

代码分析

Configuration configure = new Configuration().configure("hibernate.cfg.xml");
		SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		//获取一个快照
		User u = session.get(User.class, 5);
		//获取之前的数据与之对比,进行分析
			System.out.println(u.getUserName());//徐玉溪
		u.setUserName("郑文昔");
		System.out.println(u.getUserName());//郑文昔
		transaction.commit();
		session.close();
  1. 加载策略
    3.1 立即加载
    代码分析
public User getUser(User user) {
		SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		User u = session.get(User.class,user.getId());
			transaction.commit();
		session.close();
		return u;
	}

3.2 延迟加载
代理对象
存单 LazyInitializationException
代码分析

public User loadUser(User user) {
		
	SessionFactory sessionFactory = configure.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		User u = session.load(User.class,user.getId());
		transaction.commit();
		session.close();
		return u;
	}

在代码测试会出现错误
错误1:
org.hibernate.LazyInitializationException: could not initialize proxy [com.zking.one.entity.User#5] - no Session
解决:org.Hibernate.lazyinitializationException:无法初始化代理[com.zking.one.tiy.user
这是一个懒加载的问题,将查询的oid(Object id)保存到session的代理proxy中,
当要真正用到查询的对象的时候,在去执行查询sql语句。

  1. 并发控制 version

错误2:
Error during managed flush [Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.zking.two.entity.Student#24]]

解决:在托管刷新期间发生错误[行被另一个事务更新或删除(或未保存的值映射不正确)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值