【5.0】对象生命周期及crud操作

1. 对象状态及生命周期

  • 瞬时状态[transient]:对象在内存中存在,在session和数据库中不存在;
  • 持久状态[persistent]:对象在数据库,session中都存在;
  • 游离状态[detached]:对象在内存中存在,在session中不存在。

2.  new【瞬时】->save【持久】->close【游离】->update【持久】

3.  get/load(持久) -> delete(瞬时);     get/load(持久) -> colse(游离)

工具类:

package cn.siggy.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	private static Configuration cfg=null;
	private static SessionFactory factory=null;
	private static Session session = null;
	static{
		cfg = new Configuration().configure();
		factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder()
		.applySettings(cfg.getProperties()).build());
	}
	public static Session getSession(){
		if(factory!=null)
			return session=factory.openSession();
		factory=cfg.buildSessionFactory(new StandardServiceRegistryBuilder()
		.applySettings(cfg.getProperties()).build());
		return session=factory.openSession();
	}
	public static void closeSession(){
		if(session!=null&&session.isOpen())
			session.close();
	}
} 

测试类:

package cn.siggy.test;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.siggy.pojo.User;
import cn.siggy.util.HibernateUtil;

public class HibernateTest {
	@Test
	public void testSave(){
		Session session=null;
		Transaction tx=null;
		User user=null;
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//构造对象--瞬时状态
			user = new User();
			user.setName("刘德华");
			user.setPwd("2222");
			//持久状态,user被session管理,并且id有值--oid,即对象id
			session.save(user);
			//在持久状态下;脏数据检查:当提交事务,清理缓存时发现session中数据
			//和数据库中数据不一致时,将会把session中的数据更新到数据库中
			user.setName("学友");
			//在保存以后 再修改对象 那么将会产生2条sql语句,那么效率较低,建议在save前修改
			session.flush();
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			HibernateUtil.closeSession();
		}
		//user:游离状态
		System.out.println("姓名:"+user.getId());
		System.out.println("姓名:"+user.getName());
		user.setName("朝伟");
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//持久状态
			session.update(user);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			HibernateUtil.closeSession();
		}
	}

	@Test
	public void testLoad(){
		Session session=null;
		Transaction tx=null;
		User user=null;
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//持久状态
			//load方法 相当于 之前的getById
			//如果load查询的数据不存在,那么 抛出异常
			//load不会立即查询数据,当使用的时候再查找数据
			user = (User)session.load(User.class,1) ;
			//System.out.println(user);
			System.out.println("id:"+user.getId());
			System.out.println("姓名:"+user.getName());
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			HibernateUtil.closeSession();
		}
	}

	@Test
	public void testGet(){
		Session session=null;
		Transaction tx=null;
		User user=null;
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//持久状态
			//get方法 相当于 之前的getById
			//如果get查询的数据不存在,那么返回null
			//get方法会立即查询数据(session--数据库)
			user = (User)session.get(User.class, 1) ;
			System.out.println(user);
			user.setName("张三");
			//System.out.println("姓名:"+user.getName());
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			//关闭session
			HibernateUtil.closeSession();
		}
		//游离状态
		user.setName("siggy");
		System.out.println("============");
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//持久
			session.update(user);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			//关闭session
			HibernateUtil.closeSession();
		}
	}

	@Test
	public void testGet1(){
		Session session=null;
		Transaction tx=null;
		User user=null;
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//持久状态
			//get方法 相当于 之前的getById
			//如果get查询的数据不存在,那么返回null
			//get方法会立即查询数据(session--数据库)
			user = (User)session.get(User.class, 2) ;
			session.delete(user);
			//瞬时状态
			user.setName("王五");
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			//关闭session
			HibernateUtil.closeSession();
		}
		//瞬时状态

	}

	@Test
	public void testUpdate(){
		Session session=null;
		Transaction tx=null;
		User user=null;
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//手动创建对象 可以被更新,需要指定id
			//当指定id不存在时 会抛异常
			user = new User();
			user.setId(10);
			user.setName("paul");
			session.update(user);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			//关闭session
			HibernateUtil.closeSession();
		}
		//瞬时状态

	}

	@Test
	public void testUpdate1(){
		Session session=null;
		Transaction tx=null;
		User user=null;
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//手动创建对象 可以被更新,需要指定id
			//当指定id不存在时 会抛异常
			user = (User)session.get(User.class, 1);
			user.setName("t_bag");
			user.setPwd("3333");
			session.update(user);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			//关闭session
			HibernateUtil.closeSession();
		}
		//瞬时状态
	}

	@Test
	public void testDelete(){
		Session session=null;
		Transaction tx=null;
		User user=null;
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//手动构建对象 并指定id可以从数据库删除
			//如果指定id不存在 将抛异常
			user = new User();
			user.setId(3);
			session.delete(user);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			//关闭session
			HibernateUtil.closeSession();
		}
		//瞬时状态
	}

	@Test
	public void testDelete1(){
		Session session=null;
		Transaction tx=null;
		User user=null;
		try {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			user = (User)session.get(User.class, 1);
			if(user!=null)
				session.delete(user);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			//关闭session
			HibernateUtil.closeSession();
		}
		//瞬时状态
		System.out.println(user.getId() + "+" + user.getName());
	}
}

  

时间: 2024-10-10 13:11:32

【5.0】对象生命周期及crud操作的相关文章

struts2.0中Action的对象生命周期详解!!(转)

原文出处:http://blog.csdn.net/wxy_g/article/details/2071662 有很多人问Struts2.0中的对象既然都是线程安全的,都不是单例模式,那么它究竟何时创建,何时销毁呢? 这个和struts2.0中的配置有关,我们来看struts.properties ### if specified, the default object factory can be overridden here ### Note: short-hand notation is

[翻译]理解C#对象生命周期

看到网上的一篇讲C#对象生命周期(Object Lifetime)的文章,通俗易懂,而且有图,很适合初学者学习,就翻译过来了.后来发现这是Pro C# 2010 and the .NET 4 Platform的第八章中的一部分.(感谢 大乖乖 提醒).文中的专业名词第一次出现时,括号里会标注对应的英文单词. 请尊重作者劳动,转载请注明出处:http://www.cnblogs.com/Jack47/archive/2012/11/14/2770748.html. ----2012年11月15日修

ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

Ninject之旅之三:Ninject对象生命周期

摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生命周期提供了强大的支持.在我们定义一个绑定的时候,定义创建对象的范围.在那个范围内,对象将被重用,每次绑定只存在一次.注意,对象不允许依赖于生命周期比自己小的对象. 1.暂时范围 在暂时态范围内,对象生命周期不被Ninject进行管理.任何时候请求一个类型的对象,都将创建一新对象.Ninject不管

Vue2.0 探索之路——生命周期和钩子函数的一些理解(转)

前言 在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这对后面的踩坑是相当不利的. 因为我们有时候会在几个钩子函数里做一些事情,什么时候做,在哪个函数里做,我们不清楚. 于是我开始先去搜索,发现vue2.0的生命周期没啥文章.大多是1.0的版本介绍.最后还是找到一篇不错的(会放在最后) vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0

6、对象生命周期和垃圾回收基础

掠过架构化异常处理不谈,接下来主要介绍CLR怎样通过垃圾回收来管理已分配的类实例(对象).C#程序员从来不直接在内存中删除一个托管对象,相反,.net对象被分配到了一块叫做托管堆的内存区域上,到了某个时候他们被垃圾回收期自动销毁. 及时释放内部非托管资源:使用System.Object.Fimalize()虚方法和IDisposable接口. .net4垃圾回收器的新功能:后台垃圾回收和使用System.Lazy<>泛型实现的延迟实例化. 第一个问题,类.对象和引用. 类是一个蓝图,描述这个类

Vue 3.0 的生命周期

new Vue() new一个vue实例化对象 init Event & Lifecycle 执行一些初始化和生命周期相关的操作 beforeCreate 组件实例刚刚被创建出来 执行一些初始化和生命周期相关的操作 init injections & reactivity 初始化注入和校验 created data数据属性已经绑定,放在data中的属性当值发生改变的同时,视图也会改变 组件实例创建完成,属性已经绑定,但是DOM还没有生成,$el属性还不存在 此时还没有创建el Has &q

Vue2.0 探索之路——生命周期和钩子函数的一些理解

前言 在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这对后面的踩坑是相当不利的. 因为我们有时候会在几个钩子函数里做一些事情,什么时候做,在哪个函数里做,我们不清楚. 于是我开始先去搜索,发现vue2.0的生命周期没啥文章.大多是1.0的版本介绍.最后还是找到一篇不错的(会放在最后) vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0

ceph rgw 对象存储 对象 生命周期 设置 -- lifecycle

1.简介 1.1 介绍     对于 存储 来说,容量 当然是 越大越好了,最好 可以 无限 写入(哈哈,哪有 那么 好的 事):但是 我们 可以 删除 老旧 无用的数据,不过 总不能 时时刻刻 的手动 删除 数据吧:我们 可以 根据 一定的规则 删除 老旧的数据,此时 就可以 设置 对象 生命周期规则,制定 数据 删除 规则,对于 客户来说,集群 好像 就可以 无限量 写入了(哈哈哈,所以 后端 才是 真实的,但是 删除 数据 有风险,谨慎操作哦!!!)     1.2 前提 条件     你