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("[email protected]");

			Transaction tx=session.beginTransaction();

			session.save(user);

			tx.commit();

		} catch (HibernateException e) {

			e.printStackTrace();

		}

	}

}

你可能感兴趣的:(Hibernate)