日出星辰

Hibernate学习之初步使用

package com.test;

import java.util.List;
import com.model.Tuser;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
import junit.framework.Assert;
import junit.framework.TestCase;

public class HibernateTest extends TestCase {

	Session session = null;

	/**
	 * setUp方法在TestCase初始化的时候会自动调用 一般用于初始化公用资源 这个方法中用于初始化Hibernate Seesion
	 */
	protected void setUp() {
		try {
			/**
			 * 采用hiberante.properties或者hibernate.cfg.xml配置文件初始化代码的方法
			 * Configuration cfg = new Configuration();
			 * cfg.addClass(Tuser.class);
			 */

			/**
			 * 采用hibernate.cfg.xml配置文件 注意与上面初始化configuration时代差异:
			 * 1.Configuration的初始化方式
			 * 2.xml文件中已经定义了Mapping文件,因此无需再编码导入
			 */
			//-------------------------Configuration基础语义-----------------------------------------
			//Configuration类负责管理Hibernate配置信息。Hibernate运行时需要获取一些底层实现的基本信息,其中关键属性
			//数据库url、数据库用户名、密码、JDBC驱动类、dialect(适配器)
			//Configuration Hibernate会自动在当前的classpath中搜寻hibernate.cfg.xml文件并将其加载至内存中,作为后续操作的基础配置
			//Configuration类一般只有获取SessonFacotry时需要涉及,当SessionFactory实例创建之后,
			//由于配置信息已经由Hibernate绑定在返回的SessionFactory中,因此一般情况下无需再对Configuration进行操作
			//如果不希望使用默认的hibernate.cfg.xml文件作为配置文件,可以指定配置文件名
			//File file=new File("C:\\sample\\myhibernate.cfg.xml");
			//Configuration cofing=new Configuration().configure(file);
			Configuration config = new Configuration().configure();
			//--------------------------SessionFactory基础语义-----------------------------
			//SessionFactory负责创建session实例,可以通过Configuration实例构建SessionFactory
			//Configuration实例config会根据当前的数据库配置信息,构造SessionFactory实例并返回。
			//SessionFactory一旦构造完毕,即被赋予特定的配置信息!
			//也就是说,之后的config的任何改变将不会影响到已经创建的SessionFacotry实例(factory)
			//SessionFactory是线程安全,可由多个线程并发调用
			SessionFactory factory = config.buildSessionFactory();
			//--------------------------Session基础语义-----------------------------------
			//Session是Hibernate持久化操作的基础  session是非线程安全的
			//也就是说一个session实例只可同时有一个线程调用,同一个session实例的多线程并发调用将导致不可预知的错误
			session = factory.openSession();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 与setUP相对应,TestCase执行完毕时,会自动调用tearDown方法 一般用于资源释放
	 * 此方法中用于关闭在setUp方法中打开的Hibernate Session
	 */
	protected void tearDown() {
		try {
			session.close();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 对象持久化(Insert)方法 Junit中,以“test”作为前缀的方法为测试方法,将被Junit自动添加到测试计划中
	 */
	public void testInsert() {
		Transaction tran = null;
		try {
			tran = session.beginTransaction();
			Tuser user = new Tuser();
			user.setName("zhangsan");
			session.save(user);
			session.flush();   //把缓存中的数据刷新到数据库
			tran.commit();
			Assert.assertEquals(user.getId().intValue() > 0, true);
		} catch (HibernateException e) {
			e.printStackTrace();
			Assert.fail(e.getMessage());
			if (tran != null) {
				try {
					tran.rollback();
				} catch (HibernateException e1) {
					e1.printStackTrace();
				}
			}
		}
	}

	/**
	 * 对象读取(select)测试
	 */
	public void testSelect() {
		String hql = "from Tuser where name='zhangsan'";
		try {
			@SuppressWarnings("rawtypes")
			List userList = session.createQuery(hql).list();
			Tuser user = (Tuser) userList.get(0);
			Assert.assertEquals(user.getName(), "zhangsan");
		} catch (HibernateException e) {
			e.printStackTrace();
			Assert.fail(e.getMessage());
		}
	}
	
	public void testUserType(){
		try {
			Tuser user=(Tuser) session.load(Tuser.class, 5);
			List list=user.getEmail();
			list.add("saadsd@163.com");
			Transaction tx=session.beginTransaction();
			session.save(user);
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
}

posted on 2011-08-23 10:47 日出星辰 阅读(57) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: