Hibernate框架session中方法详解

各种状态定义

瞬时态:没有交给session管理,在数据库中也没有这个对象
持久态:对象交给session管理,最终数据库中会有这个对象
游离态:对象没有交给session管理,但数据库中有这个对象
删除态:执行delete()方法后的对象

session方法之save方法

测试一
@Test
	public void testOne() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		// user对象已经产生,此时是临时状态-没有交给Session管理,和数据库没有关联(数据库中没这个对象)
		User user = new User(); 
		// 此时仍然是临时状态
		user.setName("悟空");
		// 持久状态,user对象交给session管理,且数据库中没有这条记录
		session.save(user);
		// 由于此时user对象是持久状态,即由session管理,所以此时仍然会更新进数据库
		user.setName("八戒");
		transaction.commit();
		session.close();
		// 此时由于session已经关闭,但数据库中已经有了user这个对象,所以是游离状态
		// 得到的结果为八戒
		System.out.println(user.getName());
		
	}

在这里插入图片描述
在这里插入图片描述

测试二
	public void testOne() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		// user对象已经产生,此时是临时状态-没有交给Session管理,和数据库没有关联(数据库中没这个对象)
		User user = new User(); 
		// 此时仍然是临时状态
		user.setName("悟空");
		// 持久状态,user对象交给session管理,且数据库中没有这条记录
		session.save(user);
		// 由于此时user对象是持久状态,即由session管理,所以此时仍然会更新进数据库
		transaction.commit();
		session.close();
		// 此时由于session已经关闭,但数据库中已经有了user这个对象,所以是游离状态
		// 数据库中插入的第二条数据名称为悟空,session已经关闭,不会更新进数据库
		user.setName("八戒");
		System.out.println(user.getName());
	}

在这里插入图片描述在这里插入图片描述

测试三
public void testSave() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		User user = new User();
		user.setName("牛魔王");
		// 此时只会产生一个insert语句,只会插入一次,save()方法把临时状态转换为持久化状态,即交给session管理,放在session的缓存里面
		// 并不是每个save方法都会产生一个insert语句,如果有多个save方法,会先检查session域中有没有这个对象,不会重复插入
		session.save(user);
		session.save(user);
		session.save(user);
		session.save(user);
		session.save(user);
		session.save(user);
		
		transaction.commit();
		session.close();
	}

在这里插入图片描述

session方法之update方法

测试四
	public void testUpdate() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		// 将数据库中的游离状态转化为持久化状态
		User user = (User)session.get(User.class, 1);
		// 此时对user对象所做的改变会同步到数据库中
		System.out.println(user.getName()); 
		// 清空session域中的对象,此时user变成游离状态
		session.clear();
		// 游离状态下,对对象所做的修改不会更新到数据库中,不会有update语句生成
		user.setName("如来佛祖");
		transaction.commit();
		session.close();
	}
测试五
	public void testUpdate() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		// 将数据库中的游离状态转化为持久化状态
		User user = (User)session.get(User.class, 1);
		// 此时对user对象所做的改变会同步到数据库中
		System.out.println(user.getName()); 
		user.setName("如来佛祖");
		// 强制刷新,将session域中的对象强制刷出进数据库
		// update语句是在commit()方法执行时产生的
		// 如果不写flush方法,默认是在commit方法执行的时候刷新进数据库
		session.flush();
		// 清空session域中的对象,此时user变成游离状态
		session.clear();
		transaction.commit();
		session.close();
	}

在这里插入图片描述
在这里插入图片描述

测试六
session.evict(user); 此方法清空session域中一个指定的一个对象

public void testUpdate() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		// 将数据库中的游离状态转化为持久化状态
		User user = (User)session.get(User.class, 1);
		// 清空session域中所有的对象,此时user变成游离状态,即session域中没有对象
		session.clear();
		// 游离状态下,对对象所做的修改不会更新到数据库中  即下面所做的修改不会有效果
		user.setName("如来佛祖");
		// 强制刷新,将session域中的对象强制刷出进数据库
		// update语句是在commit()方法执行时产生的
		// 如果不写flush方法,默认是在commit方法执行的时候刷新进数据库
		// 因为此时session域中没有对象,所以没有update语句产生
		session.flush();
		transaction.commit();
		session.close();
	}
测试七
	public void testUpdate() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		// 将数据库中的游离状态转化为持久化状态
		User user = (User)session.get(User.class, 2);
		// 清空session域中的user对象,此时user变成游离状态
		session.evict(user);
		// 游离状态下,对对象所做的修改不会更新到数据库中  即下面所做的修改不会有效果
		user.setName("如来佛祖");
		// 调用session域中的update方法,将游离状态的user转为持久化状态
		session.update(user);
		transaction.commit();
		session.close();
	}

在这里插入图片描述

session方法之saveOrUpdate方法
执行delete()方法后的对象。

操作实体对象的方法
	save()
	update()
	saveorupdate()
	delete()

操作缓存的
	clear()
	evcit()
	flush()

查询实体对象的
	get()
	load()
	createQuery()
	createCriteria()
测试八
// 先执行插入语句,再执行输出语句

public void testOne() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		// user对象已经产生,此时是临时状态-没有交给Session管理,和数据库没有关联(数据库中没这个对象)
		User user = new User(); 
		user.setName("无法无天");
		// 一般来说,sql语句的执行是在commit方法执行的时候生成的
		// 不过也有例外,比如save方法,因为user对象在保存之前,没有id,保存之后才有id,
		// id是由数据库生成的,所以为了得到主键值,会马上执行插入语句,生成id
		session.save(user);
		System.out.println("我爱中国");
		transaction.commit();
		session.close();
	}

在这里插入图片描述

测试九
// 打印语句是在update语句之前执行,即commit方法执行之前
	public void testUpdate() {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		// 将数据库中的游离状态转化为持久化状态
		User user = (User)session.get(User.class, 3);
		// 游离状态下,对对象所做的修改不会更新到数据库中  即下面所做的修改不会有效果
		user.setName("如来佛祖");
		// 调用session域中的update方法,将游离状态的user转为持久化状态
		session.update(user);
		System.out.println("华夏民族");
		transaction.commit();
		session.close();
	}

在这里插入图片描述

测试十

在这里插入图片描述

测试十一
测试游离态对象的更新,saveOrUpdate方法,游离态,即数据库中有这个对象,而session域中没有这个对象
已知数据库中有id为1的对象
更新的时候 如果对象不存在  会报错
本方法更新的时候,会根据id判断对象是什么状态,如果是原始值(对象是null,原始类型数字是0),就是临时状态
如果不是原始值,就是游离状态。
user.setId(null),此时user就是临时状态

在这里插入图片描述

测试十二

在这里插入图片描述

测试十三
删除持久化对象

在这里插入图片描述

测试十四
删除游离态对象
如果删除的对象不存在,会报错

在这里插入图片描述

session方法之get与load方法
get和load方法,获取对象,会马上执行sql语句,因为接下来的代码中可能要用到这个对象
load:懒加载,不会马上执行sql语句,而是在第一次使用非id或class属性时才会执行,获取的时候
已经写明了class与id,所以没必要再去数据库查这两个属性值
load后返回的是代理对象,而get放法返回的是真正的对象
如果对象不存在,get会返回null,而load会报错

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

让懒加载失效的方式有两种
方式一:
配置文件hbm.xml中<class name="User" table="user" lazy="false">
方式二:
实体类中,public final class User{}  使其无法被继承生成代理类对象

lazy属性默认为true,表示可以懒加载

			                  返回值                             如果数据不存在
get       立即加载               返回真实对象或null                   返回null
load      懒加载               返回代理对象                             抛异常
操作大量数据,要防止session中对象太多,从而导致内存溢出,所以要先flush刷出,再用clear清除缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值