`

hibernate session生命周期示例

阅读更多

 今天做了一个hibernate关于session的生命周期的测试,用的eclipse的junit工具类。

在昨天入门配置的基础上,创建了一个Sourse folder  名为test,主要放置测试类。

 

首先解释一下持久化对象:

瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。
持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。
离线对象(Detached Objects):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。

 

 

生命周期:

 

 

配置好后,新建一个HibernateUtils.java类:

package com.mp.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	public static SessionFactory factory;
	
	static {
		try {
			Configuration cfg = new Configuration().configure();
			factory = cfg.buildSessionFactory();
		} catch(Exception e) {
			e.printStackTrace();
		}
	} 
	
	public static SessionFactory getSessionFactory() {
		return factory;
	}
	
	public static Session getSession() {
		return factory.openSession();
	}
	
	public static void closeSession(Session session) {
		if(session != null) {
			if(session.isOpen()) {
				session.close();
			}
		}
	}
}

 

 

这个类就是把对session的基本操作封装起来。

在数据库中新建了hibernate_session数据库,并且修改hibernate.cfg.xml文件中的配置。

 

在test中建了一个测试类SessionTest.java

 

首先对session的三个状态进行测试:

 

package com.mp.hibernate;


import java.util.Date;

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

import junit.framework.TestCase;

public class SessionTest extends TestCase {
	public void testHello() {
		System.out.println("-----------SessionTest.hello()------------");
		//throw new RuntimeException();
	}
	
	
	public void testSave1() {
		Session session = null;
		Transaction ts =  null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			ts = session.beginTransaction();
			
			//Transient状态
			user = new User();
			user.setName("哈哈");
			user.setPassword("234");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());

			//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
			session.save(user);
			
			user.setName("李鹏");
			
//			session.update(user);
			ts.commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			ts.rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
		
		//detached状态
		user.setName("张三");
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();

			//persistent状态
			session.update(user);
			session.getTransaction().commit();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
			
		}
	}
	
}

 进入debug模式调试,查看user 的变化过程

在执行了save方法后,id被创建,也就意味着user对象被创建,但是hibernate并没有执行插入语句

之后修改user的属性也是可以的

因为在提交事务后可以看到hibernate执行了两个语句,一个insert另外一个就是update;此时也能看到数据库中已经插入记录:



 

update主要是由于使用了user对象的属性。

sava()操作使得它进入persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步

 

之后的commit()执行时,进行了"脏数据检查"操作。

 

紧接着又关闭了session,在进入了detached状态(对象不存在于session中)。

 

执行到update 又转入到persistent状态。

之后提交事务,也能完成数据库的更新。

查看数据库:



 

 

之后又添加了几个测试方法,主要测试get() 和 load() 方法的不同:

	public void testReadByGetMethod() {
		Session session = null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//马上发出查询sql,加载user对象
			user = (User)session.get(User.class, "8a8af09123500da10123500ddb240001");
			System.out.println("username" + user.getName());
			
			//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
			user.setName("龙哥");
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	public void testReadByGetMethod2() {
		Session session = null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//马上发出查询sql,加载user对象
			user = (User)session.get(User.class, "845465756dfgdfdfgdfg001");
			
			//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
			user.setName("龙哥");
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	public void testReadByLoadMethod() {
		Session session = null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载)
			//延迟加载:只有真正使用这个对象的时候才加载(发出sql语句)
			//hibernate延迟加载实现原理是代理方式
			user = (User)session.load(User.class, "8a8af09123500da10123500ddb240001");
			System.out.println("username = " + user.getName());
			
			//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
			user.setName("龙哥");
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	public void testReadByLoadMethod1() {
		Session session = null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//采用load加载数据,如果数据库中没有相应的数据
			//则抛出异常ObjectNotFoundException
			user = (User)session.load(User.class, "454565555555551");
			
			//查不到对象,则抛异常
			System.out.println("username = " + user.getName());
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
	}

 

 

添加工程文件到附件中。

  • 大小: 3 KB
  • 大小: 16.8 KB
  • 大小: 2.9 KB
3
0
分享到:
评论
2 楼 y8931790 2012-11-30  
       
1 楼 kunlove2010 2011-11-30  
    

相关推荐

    Hibernate学习笔记

    004 持久对象的生命周期介绍 005 query 接口初步 006 开源 O/R 映射框架内容回顾 007 Hibernate 基本映射标签和属性介绍 008 多对一 关联映射 009 一对一 主键关联映射_单向 010 一对一 主键关联映射_双向 011 一对...

    Hibernate+中文文档

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    hibernate 教程

    持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    hibernate3.2中文文档(chm格式)

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    HibernateAPI中文版.chm

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    最全Hibernate 参考文档

    11.3.2. 长生命周期session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 11.3.4. 定制自动版本化行为 11.4. 悲观锁定(Pessimistic Locking) 12. 拦截器与事件(Interceptors and events) 12.1. 拦截...

    Hibernate中文详细学习文档

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    Hibernate 中文 html 帮助文档

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. 示例:...

    Hibernate实战(第2版 中文高清版)

     9.1 持久化生命周期   9.1.1 对象状态   9.1.2 持久化上下文   9.2 对象同一性和等同性   9.2.1 引入对话   9.2.2 对象同一性的范围   9.2.3 脱管对象的同一性   9.2.4 扩展持久化上下文   9.3 ...

    Hibernate教程

    12.3.2. 长生命周期session和自动版本化 12.3.3. 脱管对象(deatched object)和自动版本化 12.3.4. 定制自动版本化行为 12.4. 悲观锁定(Pessimistic Locking) 13. 拦截器与事件(Interceptors and events) 13.1. ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. ...

    hibernate 体系结构与配置 参考文档(html)

    扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 11.3.4. 定制自动版本化行为 11.4. 悲观锁定(Pessimistic Locking) 11.5. 连接释放模式(Connection Release Modes) 12. 拦截器...

    hibernate

    持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    Hibernate3+中文参考文档

    11.3.2. 长生命周期session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 11.3.4. 定制自动版本化行为 11.4. 悲观锁定(Pessimistic Locking) 12. 拦截器与事件(Interceptors and events) 12.1. 拦截...

    hibernate3.04中文文档.chm

    12.3.2. 长生命周期session和自动版本化 12.3.3. 脱管对象(deatched object)和自动版本化 12.3.4. 定制自动版本化行为 12.4. 悲观锁定(Pessimistic Locking) 13. 拦截器与事件(Interceptors and events) 13.1....

    hibernate 框架详解

    长生命周期session和自动版本化 12.3.3. 脱管对象(deatched object)和自动版本化 12.3.4. 定制自动版本化行为 12.4. 悲观锁定(Pessimistic Locking) 13. 拦截器与事件(Interceptors and events) 13.1. 拦截...

    Hibernate参考文档

    21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. 示例:...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    8.6.2 有状态Session Bean的生命周期 322 8.6.3 定制Session Bean的生命 周期行为 323 8.7 在Session Bean中使用事务 327 8.7.1 容器管理事务 327 8.7.2 Bean管理事务 330 8.8 拦截器 332 8.9 依赖注入 335 8.9.1 ...

Global site tag (gtag.js) - Google Analytics