5.0对象生命周期及crud操作

Posted chxbar.cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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());
	}
}

  

 

以上是关于5.0对象生命周期及crud操作的主要内容,如果未能解决你的问题,请参考以下文章

导航上的片段生命周期重叠

Android 片段生命周期

“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”

关于其活动的片段生命周期

IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

调用 replace() 时片段的生命周期是啥?