Hibernate(7)_hibernate 的对象的三种状态

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


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

一、hibernate 的对象的三种状态

1、瞬时对象(transientObjects):由我们自己创建出来,数据库中没有相应的记录,也没有被hibernate 的 Session 管理起来,这样的对象可以被 jvm 回收的。
2、持久化对象(persistentObjects):这个对象在数据库中有相应的记录,这个对象被 Session 管理起来。
3、脱管对象(detachObjects):数据库中有相应的记录,但是没有被 Session 管理。
在这里插入图片描述

二、瞬时对象转换成持久对象

在这里插入图片描述
对持久对象的修改

public void test2()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		// 创建对象,这时是瞬时对象
		User user = new User();
		user.setUname("魏宇轩");
		user.setGender(1);
		user.setBirthday(new Date());
		// 发出sql语句,把user对象纳入到Session的管理,并且保存到数据库,持久状态
		session.save(user);
		// 设置持久对象的属性,Session会把修改后的持久
		// 对象的属性值和没有修改时的做对比,如果有变化就发出update,没有就不发
		user.setUname("轩哥");
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

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

三、持久对象和脱管对象的转换

public void test3()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	User user = new User();
	try
	{
		user.setUname("魏宇轩");
		user.setGender(1);
		user.setBirthday(new Date());
		session.save(user);
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		// Session关闭,那么user由持久对象变成脱管对象
		HibernateUtils.closeSession(session);
	}

	Session session1 = HibernateUtils.getSession();
	Transaction tx1 = session1.beginTransaction();
	try
	{
		user.setUname("轩哥");
		tx1.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx1.rollback();
	} finally
	{
		HibernateUtils.closeResource(session1);
	}
}

在这里插入图片描述

public void test4()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	User user = new User();
	try
	{
		user.setUname("魏宇轩");
		user.setGender(1);
		user.setBirthday(new Date());
		session.save(user);
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		// Session关闭,那么user由持久对象变成脱管对象
		HibernateUtils.closeSession(session);
	}

	Session session1 = HibernateUtils.getSession();
	Transaction tx1 = session1.beginTransaction();
	try
	{
		user.setUname("轩轩");
		// Session1接纳了user,立即把user变成持久对象
		session1.update(user);
		tx1.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx1.rollback();
	} finally
	{
		HibernateUtils.closeResource(session1);
	}
}

在这里插入图片描述

四、通过 get 和 load 和 iterator 查询出来的对象是持久状态

public void test5()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		// 通过get方法查询的对象既在Session管理中,在数据库中也有记录所以user是持久对象
		User user = (User) session.get(User.class, 1);
		System.out.println(user);
		user.setUname("xuanxuan");
		// 发出update语句,证明是持久对象
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeSession(session);
	}
}

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

public void test6()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		// 通过get方法查询的对象既在Session管理中,在数据库中也有记录所以user是持久对象
		User user = (User) session.load(User.class, 5);
		System.out.println(user);
		user.setUname("魏宇轩");
		// 发出update语句,证明是持久对象
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeSession(session);
	}
}

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

五、持久和脱管对象转换瞬时对象

通过 delete 把数据库中的数据删除,而且清掉 Session 中的对象,那么这个对象就变成了瞬时对象。

public void test7()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();
	try
	{
		// 通过get方法查询的对象既在Session管理中,在数据库中也有记录所以user是持久对象
		User user = (User) session.get(User.class, 1);
		System.out.println(user);
		// session的删除会把数据库中的记录删掉,同时清掉Session的user对象
		session.delete(user);
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeSession(session);
	}
}

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

如有错误,欢迎指正!

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

猜你喜欢

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