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();
}
}
}