您的位置:首页 > 其它

Hibernate持久化对象的三种状态

2016-01-07 15:19 183 查看
Hibernate中持久化对象的状态有:Transient、Persistent、Detached



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



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

[java]
view plaincopyprint?

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方法查询数据库中不存在的数据,如果不存在返回null;get永远不支持lazy
Load方法
特点:与get方法相同的是加载出来的数据也是持久化的;不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载),什么叫lazy?只有真正使用这个对象的时候,再创建,对于hibernate来说才真正的发出查询语句,主要是为了提高性能,lazy是hibernate中非常重要的特性。hibernate的lazy是如何实现的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的,而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类生成代理,它采用的是继承方式;采用load查询不存在的数据hibernate会抛出ObjectNotFoundException异常;load默认的是支持lazy
Update方法
特点:先加载再更新
Delete方法
特点:先加载再删除
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: