Hibernate持久化对象的三种状态

Hibernate中持久化对象的状态有:TransientPersistentDetached


持久化对象的生命周期是:



怎样理解持久化对象的三种状态呢?下面的代码会体现出来

package com.bjpowernode.hibernate;

import java.util.Date;

import junit.framework.TestCase;

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

public class SessionTest extends TestCase {

	public void testSave1() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//此时对象刚new出来,对象为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状态,数据库中存在,但不被session管理
		user.setName("王五");
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//通过session.update()方法将detached状态的对象重新纳入session管理
			//此时将变为persistent状态的对象
			//persistent状态的对象,在清理缓存是会和数据库同步
			session.update(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}

Session对象的几种方法:

Get方法

特点:get加载上来的对象为持久对象执行get会马上发出查询语句get方法查询数据库中存在的数据;get方法查询数据库中不存在的数据,如果不存在返回nullget永远不支持lazy

Load方法

特点:与get方法相同的是加载出来的数据也是持久化的;不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载),什么叫lazy?只有真正使用这个对象的时候,再创建,对于hibernate来说才真正的发出查询语句,主要是为了提高性能,lazy是hibernate中非常重要的特性hibernate的lazy是如何实现的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类生成代理,它采用的是继承方式采用load查询不存在的数据hibernate会抛出ObjectNotFoundException异常load默认的是支持lazy

Update方法

特点:先加载再更新

Delete方法

特点:先加载再删除



  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值