`
逆风逛飙
  • 浏览: 8112 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
最近访客 更多访客>>
社区版块
存档分类
最新评论

hibernate:测试实体对象的生命周期

阅读更多
测试实体对象的生命周期

pojo:
package com.lhtwqh.hibernate;

import java.util.Date;

public class User {
	private String id;
	private String name;
	private String password;
	private Date createTime;
	private Date expireTime;
	
	public Useffffffffffffffffffffffffffffffffffffffffffr(){
		
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	public Date getExpireTime() {
		return expireTime;
	}
	public void setExpireTime(Date expireTime) {
		this.expireTime = expireTime;
	}

}



session工厂:HibernateUtils
package com.lhtwqh.hibernate;

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

public class HibernateUtils {
	private static SessionFactory sessionFactory;

	static {
		try {
			Configuration config = new Configuration().configure();
			sessionFactory = config.buildSessionFactory();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static Session getSession() {
		return sessionFactory.openSession();
	}

	public static void closeSession(Session session) {
		if (session != null) {
			if (session.isOpen()) {
				session.close();
			}
		}
	}

}


junit简介:
* 编写测试类xxxTest,需要继承TestCase
* 编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:
  public void testHello1() {}
* 最好单元测试的代码单独建立一个目录
package com.lhtwqh.hibernate;



import java.util.Date;

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

import junit.framework.TestCase;

public class SessionTest extends TestCase {

	public void testHello1() {
		System.out.println("-----------SessionTest.Hello1()------------");
		//throw new java.lang.RuntimeException();
	}
	
	public void testHello2() {
		System.out.println("-----------SessionTest.testHello2()------------");
		
		//this.assertEquals("hello", "hello111");
	}
	
	public void testSave1() {
		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状态,当属性发生改变的时候,hibernate会自动和数据库同步
			session.save(user);
			
			user.setName("王五");
			//session.update(user);
			tx.commit();
		}catch(Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		//detached状态
		user.setName("张三");
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
	 		//persistent状态
			session.update(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}		
	}
	
	public void testReadByGetMethod1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//马上发出查询sql,加载User对象
			User user = (User)session.get(User.class, "402880d01b9bf210011b9bf2a2ff0001");
			System.out.println("user.name=" + 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;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//采用get加载数据,如果数据库中不存在相应的数据,返回null
			User user = (User)session.get(User.class, "asdfsafsdfdsf");

			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	public void testReadByLoadMethod1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载)
			//延迟加载:只有真正使用这个对象的时候,才加载(发出sql语句)
			//hibernate延迟加载实现原理是代理方式
			User user = (User)session.load(User.class, "402880d01b9bf210011b9bf2a2ff0001");
			System.out.println("user.name=" + user.getName());
			
			//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
			user.setName("发哥");
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	public void testReadByLoadMethod2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//采用load加载数据,如果数据库中没有相应的数据
			//那么抛出ObjectNotFoundException
			User user = (User)session.load(User.class, "55555555");
			
			System.out.println(user.getName());
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
			throw new java.lang.RuntimeException();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	public void testUpdate1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//手动构造的detached状态的对象
			User user = new User();
			user.setId("402880d01b9be8dc011b9be9b23d0001");
			user.setName("德华");
			
			session.update(user);
			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();
			
//			//手动构造的detached状态的对象
//			User user = new User();
//			user.setId("402880d01b9be8dc011b9be9b23d0001");
//			user.setName("德华");
//			session.delete(user);
			
			User user = (User)session.load(User.class, "402880d01b9be8dc011b9be9b23d0001");
			session.delete(user);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		//transient状态
	}	
	
}




get和load的区别?
* get不支持lazy,load支持lazy
* 采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常

transient状态的特征?
* 在数据库中没有与之匹配的数据
* 没有纳入session的管理

persistent状态的特征?
* persistent状态的对象在数据库中有与之匹配的数据
* 纳入了session的管理
* 在清理缓存(脏数据检查)的时候,会和数据库同步

detached状态的特征?
* 在数据库中有与之匹配的数据
* 没有纳入session的管理
分享到:
评论
1 楼 qiujy 2008-11-22  
楼主是尚学堂的学生??

相关推荐

    测试实体对象的生命周期

    本文将详细探讨“测试实体对象的生命周期”,并结合给定的标签“源码”和“工具”,阐述如何通过Hibernate Session来理解和控制这些对象的状态。 首先,理解实体对象的生命周期对于数据库操作至关重要。在Hibernate...

    Spring和Hibernate学习笔记

    第二课:测试实体对象的生命周期 第三课:hibernate基本映射 第四课:hibernate多对一关联映射 ...................... Spring: 第一课:构建Spring的环境并建立一个例子 第三课:spring Bean的作用域 第四课:...

    hibernate操纵实体对象

    `HibernateSessionFactory`通常在应用启动时初始化一次,然后在整个应用生命周期中复用,以提高性能。创建`SessionFactory`通常涉及配置Hibernate的XML文件,其中包含了数据库连接信息、实体映射等设置。 `...

    08 领域对象的生命周期 102-116.rar

    9. **生命周期方法**:在某些编程语言和框架中,领域对象可能包含一些生命周期方法,如 `save()`、`delete()`、`load()` 等,用于操作对象的生命周期。 10. **CQRS(命令查询责任分离)**:在复杂系统中,CQRS 模式...

    Hibernate 框架测试版本

    SessionFactory是线程安全的,一般在应用程序启动时创建一次,然后在整个应用程序生命周期中重复使用。Session提供了对数据库的读写操作,包括查询、插入、更新和删除数据。 5. **持久化操作** 使用`save()`或`...

    Spring3整合Hibernate4测试Demo

    1. **Spring的IoC(Inversion of Control,控制反转)**:Spring通过IoC容器管理对象的生命周期和依赖关系,使得代码更加松耦合,提高了可测试性和可维护性。 2. **Hibernate4配置**:配置Hibernate4,包括设置...

    hibernate:Hibernate的Java测试应用程序

    5. **Hibernate Master** (压缩包子文件): 这个文件夹很可能是项目源代码的根目录,包含了配置文件(如hibernate.cfg.xml)、实体类、DAO(数据访问对象)层、Service层以及相关的测试类。通过分析这些文件,我们...

    ACCP7北大青鸟Y2Hibernate内测试题完整版

    8. Session的生命周期和缓存管理:了解何时打开和关闭Session,以及一级缓存和二级缓存的作用。 9. 回滚和事务管理:在租房系统中,涉及到资金交易时,事务的正确处理至关重要。 10. 异常处理:理解Hibernate抛出的...

    SSH(struts2,Hibernate,Spring)整合及测试亲测可用

    Spring的IOC容器负责管理对象的生命周期和依赖关系,而AOP则允许在不修改原有代码的情况下,添加新的功能或行为。此外,Spring还提供了事务管理、数据访问集成、MVC框架等一系列功能,使得应用的各个部分可以无缝...

    Hibernate源码

    - **事件监听器**:探索EntityListener和Interceptor,它们可以在对象生命周期中的特定事件上执行自定义逻辑。 - **性能优化**:学习如何通过调整缓存策略、批处理、连接池配置等手段提高Hibernate的性能。 总之,...

    hibernATE的源代码

    - **事件和监听器**:观察Hibernate的生命周期事件,如预加载、加载、保存、更新和删除,以及如何自定义监听器来扩展功能。 - **CGLIB和ASM**:Hibernate可能使用这些字节码库生成动态代理类,实现懒加载和其他高级...

    Hibernate基础教程

    #### 四、持久对象的生命周期介绍 在Hibernate中,对象有三种状态:瞬时态(Transient)、持久态(Persistent)和游离态(Detached)。 - **瞬时态**:未被任何`Session`管理的对象。 - **持久态**:被`Session`...

    Hibernate原理解析

    Hibernate管理着对象的生命周期,包括初始化、持久化、脱管和删除。通过回调方法如`@PrePersist`、`@PostLoad`等,开发者可以在特定生命周期阶段执行自定义逻辑。 通过仿写Hibernate的持久层框架,我们可以更好地...

    hibernate4.1中文api

    - **上下文会话**: 管理会话的生命周期,以及与线程的绑定。 #### 3. 配置 - **编程配置**: 通过代码方式配置Hibernate。 - **获取SessionFactory**: 使用`Configuration`类创建`SessionFactory`实例。 - **JDBC...

    Hibernate Recipes

    - **事务管理**: 支持本地事务和JTA事务,通过`Transaction`或`UserTransaction`接口管理事务生命周期。 - **性能调优**: 如调整SQL查询、使用批处理、优化检索策略等手段提高应用程序的整体性能。 6. **集成...

    jeesite web框架hibernate+spring+shiro

    通过Hibernate的实体类和映射文件,我们可以方便地将数据库表与Java对象进行绑定,实现数据的自动持久化。 1. **实体类与表的映射**:Hibernate使用XML或注解来定义实体类与数据库表的对应关系,简化了数据库操作。...

    hibernate 4.3.10 版本的笔记

    - **JUnit测试**: 在编写JUnit测试时,要注意正确设置测试方法的生命周期管理,如使用`@BeforeClass`和`@AfterClass`来控制SessionFactory的创建和销毁。 - **Hibernate配置**: 在配置Hibernate时,注意`hibernate....

    strust2+spring2.5+hibernate框架例题

    在Hibernate中,实体类映射到数据库表,实体对象的CRUD操作可以通过Session接口完成。Hibernate支持二级缓存和HQL(Hibernate Query Language),提供了强大的查询功能。 将这三个框架集成,可以实现松耦合的架构,...

    springmvc spring hibernate整合Demo

    1. 配置Spring:首先,我们需要配置Spring的ApplicationContext,定义Bean并管理它们的生命周期。这通常通过XML或Java配置完成,包括Spring MVC的DispatcherServlet配置、数据源配置以及Hibernate SessionFactory...

    struts2.1+spring2.5+hibernate3.3整合之第一步(spring2.5+hibernate3.3)

    Spring2.5是全面的企业级应用框架,它不仅包含IoC(Inversion of Control,控制反转)容器,用于管理对象的生命周期和依赖关系,还提供了AOP(Aspect-Oriented Programming,面向切面编程)功能,实现了对横切关注点...

Global site tag (gtag.js) - Google Analytics