Hibernate中的JUnit和session中的get和load方法

本文介绍如何在JUnit测试中使用Hibernate,强调了JUnit测试的规范和注意事项。通过一个实例展示了Hibernate的get和load方法的区别,get方法会立即查询数据,而load方法支持延迟加载,未找到对象时会抛出异常。

    Junit是一个java语言的单元测试框架,用于编写和运行可重复的测试,使用这个框架需要注意以下几点:

       1、编写测试类的命名为XXTest,并且需要继承TestCase

       2、编写单元测试方法,方法的名称必须为test开头,方法没有返回值,采用public修饰

       3、最好将测试程序放在单独的目录中

       4、建议使用断言的方式

    通过Hibernate的例子我们讲解如何使用Junit:

如图所示的目录结构:


     我们需要引入与Hibernate相关的jar包,这里作为了一个库(HIBERNATE3)包在了程序里。HibernateUitls.java是Hibernate的助手类,主要用于读取配置文件

package com.bjpowernode.hibernate;

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

public class HibernateUtils {
	private static SessionFactory factory;
	static{
		try{
			//读取hibernate.hbm.xml文件
			Configuration cfg=new Configuration().configure();			
			//建立sessionFactory
			factory=cfg.buildSessionFactory();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public static Session getSession(){
		return factory.openSession();
	}
	public static void closeSession(Session session){
		if(session!=null){
			if(session.isOpen()){
				session.close();
			}
		}
	}
	public static SessionFactory getSessionFactory(){
		return factory;
	}
}

    ExportDB.java用于生成数据库表,也即将hbm生成ddl

package com.bjpowernode.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 * 将hbm生成ddl
 * @author Administrator
 *
 */
public class ExportDB {

	public static void main(String[] args) {		
		//默认读取hibernate.cfg.xml文件
		Configuration cfg = new Configuration().configure();
		SchemaExport export = new SchemaExport(cfg);
		export.create(true,true);
	}
}

    建立实体User类,然后编写实体的映射文件User.hbm.xml:

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User">
		<id name="id">
			<generator class="uuid"/>
		</id>
		<property name="name"/>
		<property name="password"/>
		<property name="createTime"/>
		<property name="expireTime"/>
	</class>
</hibernate-mapping>

     这里指明主键为id,主键的生成策略为uuid,关于主键生成策略上一篇博客中详细的介绍了。

下面就要编写业务处理类了UserManager.java:

package com.bjpowernode.hibernate;

public class UserManager {
	public void add(String username){
		System.out.println("UserManager.add");
		//throw new RuntimeException();
	}
	public void del(String username){
		System.out.println("UserManager.del");
	}
	public String findUserById(String userId){
		return "Tom";
	}
}

    编写测试类UserManagerTest.java:

package com.bjpowernode.hibernate;
import junit.framework.TestCase;

public class UserManagerTest extends TestCase {
	public void testAdd(){
		UserManager userManager=new UserManager();
		userManager.add("Jack");
		System.out.println("UserManagerTest.testAdd()");
	}
	public void testDel(){
		UserManager userManager=new UserManager();
		userManager.del("Jack");
		System.out.println("UserManagerTest.testDel()");
	}
	//断言
	public void testFindUserById(){
		UserManager userManager=new UserManager();
		String username=userManager.findUserById("0001");
		System.out.println(username);
		String expected="Jack";//断言预期值
		this.assertEquals(expected, username);//username是断言的实际值
	}
}

    testFindUserById方法采用的断言的方式,定义一个断言的预期值,然后assertEquals方法输出断言的实际值并和预期值进行比较。

运行的结果:

    因为数据库中的数据时Tom,所以执行的结果是数据库中的值,与断言的预期值不一样。

    同样在这个例子中,我们讲解Session中的get和load的方法的使用。

public void testGet1(){
		Session session=null;
		try{
			session=HibernateUtils.getSession();
			session.beginTransaction();
			User user=(User)session.get(User.class, "402880812553589901255358e2b30001");
			System.out.println(user.getName());
			user.setName("赵六");
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
			
		}finally{
			HibernateUtils.closeSession(session);
		}
	}

    get方法加载上来的对象为持久化对象,不支持lazy也即延迟加载,换句话说执行了get方法会马上发出查询语句,先查询缓存,如果缓存中存在数据,则直接返回,如果缓存中不存在数据就会转而查询数据库,如果数据库中存在,则返回该对象,如果数据库中不存在,则返回null。

public void testLoad1(){
		Session session=null;
		try{
			session=HibernateUtils.getSession();
			session.beginTransaction();
			User user=(User)session.load(User.class, "402880812553589901255358e2b30001");
			System.out.println(user.getName());
			user.setName("王五");
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
			
		}finally{
			HibernateUtils.closeSession(session);
		}
	}

     load方法支持延迟加载,所以执行load之后不会马上发出查询语句,首先查询一级缓存,如果存在则直接返回对象,如果不存在转而查询二级缓存,如果存在则直接返回对象,如果不存在则继续查询数据库,如果存在则返回对象,如果不存在则会抛出ObjectNotFoundException异常,对于缓存的知识,我们下面的博客详细讲解!










评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值