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