4.测试持久化对象的状态:测试

本文详细介绍了Java Hibernate ORM中Session的使用,包括保存、获取、加载、删除、更新操作及对象状态转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.bjpowernode.test;

import java.util.Date;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.bjpowernode.hibernate.HibernateUtils;
import com.bjpowernode.hibernate.User;

public class SessionTest extends TestCase {

	public void testSave1() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//Transient状态
			User user = new User();
			user.setName("张三");
			user.setPassword("123");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());
			
			//Persistent状态
			//Persistent状态的对象,当对象的属性发生改变的时候
			//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
			session.save(user);
			
			user.setName("李四");
			
			tx.commit();
			
		}catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}finally {
			HibernateUtils.closeSession(session);
		}
		//detached状态
	}
	
	public void testSave2() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//Transient状态
			User user = new User();
			user.setName("张三");
			user.setPassword("123");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());
			
			//Persistent状态
			//Persistent状态的对象,当对象的属性发生改变的时候
			//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
			session.save(user);
			
			user.setName("李四");
			
			//可以显示的调用update方法,因为此时为持久状态,调用update没有什么意义
			session.update(user);
			
			tx.commit();
			
		}catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}finally {
			HibernateUtils.closeSession(session);
		}
		//detached状态
	}	
	
	public void testSave3() {
		Session session = null;
		Transaction tx = null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//Transient状态
			user = new User();
			user.setName("张三");
			user.setPassword("123");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());
			
			//Persistent状态
			//Persistent状态的对象,当对象的属性发生改变的时候
			//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
			session.save(user);
			
			user.setName("李四");
			
			tx.commit();
			
		}catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}finally {
			HibernateUtils.closeSession(session);
		}
		//detached状态
		user.setName("王五");
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//将detached状态的对象重新纳入session管理
			//此时将变为persistent状态的对象
			//persistent状态的对象,在清理缓存是会和数据库同步
			session.update(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testGet1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//get加载上来的对象为持久对象
			//执行get会马上发出查询语句
			User user = (User)session.get(User.class, "8a80808339608dcd0139608dce170001");
			System.out.println(user.getName());
			
			//Persistent状态
			//Persistent状态的对象,当对象的属性发生改变的时候
			//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
			user.setName("赵柳");
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testGet2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//get方法加载数据,如果不存在返回null
			User user = (User)session.get(User.class, "54434343434343");
			System.out.println(user.getName());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载)
			//什么叫lazy?只有真正使用这个对象的时候,再创建,对于hibernate来说
			//才真正的发出查询语句,主要是为了提高性能,lazy是hibernate中非常重要的特性
			//hibernate的lazy是如何实现的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的
			//而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类
			//生成代理,它采用的是继承方式
			User user = (User)session.load(User.class, "8a80808339608dcd0139608dce170001");
			System.out.println(user.getName());
			user.setName("王五");
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testLoad2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//采用load查询不存在的数据,hibernate会抛出ObjectNotFoundException异常
			User user = (User)session.load(User.class, "555554");
			System.out.println(user.getName());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testDelete1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			User user = (User)session.load(User.class, "8a808083396093d401396093d5c30001");
			//删除,建议采用此种方式删除:先加载再删除
			session.delete(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}			

	public void testDelete2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//手动构造Detached对象
			User user = new User();
			user.setId("8a80808339609b1d0139609b1e130001");
			session.delete(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}			
	
	public void testUpdate1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//手动构造Detached对象
			User user = new User();
			user.setId("8a80808339609baf0139609bb06f0001");
			user.setName("周六");
			session.update(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}			

	public void testUpdate2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//建议采用此种方式更新,先加载再更新
			User user = (User)session.load(User.class, "8a80808339609ca70139609ca8e00001");
			user.setName("周六");
			//可以显示的update
			session.update(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}			
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值