Hibernate(8)_Session 的 flush 方法剖析

本系列博客汇总在这里:Hibernate 汇总


源码工程文件为:hibernate4.3_03

一、数据库的事务的隔离级别

在这里插入图片描述
查询 mysql 的数据库事务的隔离级别
在这里插入图片描述
修改 mysql 的数据库的事务隔离级别

set global tx_isolation = 'read-uncommitted';
set tx_isolation = 'read-uncommitted';

二、Session 的 flush

1、使用 uuid 主键生成策略来测试 flush

public void test1()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		User user = new User();
		user.setUname("魏宇轩");
		user.setGender(1);
		user.setBirthday(new Date());
		// 因为是uuid方式生成的主键,由Session给生成,把user对象存储在Session的临时存储区,在Session的持久区,把dirty变成true
		session.save(user);
		// 发出sql语句,清理临时存储区,把dirty变成false
		session.flush();
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

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

2、使用 native 主键生成策略来测试 flush

public void test3()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		User user = new User();
		user.setUname("魏宇轩");
		user.setGender(1);
		user.setBirthday(new Date());
		// 因为是使用native方式生成主键,所以save的时候要发出sql来产生主键,持久区有数据,dirty是true
		session.save(user);
		// 把dirty变成false
		session.flush();
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

逐出 user

public void test4()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		User user = new User();
		user.setUname("魏宇轩");
		user.setGender(1);
		user.setBirthday(new Date());
		// 因为是使用native方式生成主键,所以save的时候要发出sql来产生主键,持久区有数据,dirty是true
		session.save(user);
		// 把user逐出Session
		session.evict(user);
		// Session中没有数据flush没有意义
		session.flush();
		// 但是commit依然会把数据提交到数据库,因为sql已经发出了
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

三、Session 的 flush 完成大量数据入库的功能

public void test5()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		for (int i = 0; i < 100009; i++)
		{
			User user = new User();
			user.setUname("魏宇轩");
			user.setGender(1);
			user.setBirthday(new Date());
			session.save(user);
			if (i % 100 == 0)
			{
				session.flush();
			}
		}
		session.flush();
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

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

如有错误,欢迎指正!

发布了448 篇原创文章 · 获赞 210 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36260974/article/details/104105107