Hibernate學(xué)習(xí)之初步使用
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初始化的時(shí)候會(huì)自動(dòng)調(diào)用 一般用于初始化公用資源 這個(gè)方法中用于初始化Hibernate Seesion */ protected void setUp() { try { /** * 采用hiberante.properties或者h(yuǎn)ibernate.cfg.xml配置文件初始化代碼的方法 * Configuration cfg = new Configuration(); * cfg.addClass(Tuser.class); */ /** * 采用hibernate.cfg.xml配置文件 注意與上面初始化configuration時(shí)代差異: * 1.Configuration的初始化方式 * 2.xml文件中已經(jīng)定義了Mapping文件,因此無需再編碼導(dǎo)入 */ //-------------------------Configuration基礎(chǔ)語義----------------------------------------- //Configuration類負(fù)責(zé)管理Hibernate配置信息。Hibernate運(yùn)行時(shí)需要獲取一些底層實(shí)現(xiàn)的基本信息,其中關(guān)鍵屬性 //數(shù)據(jù)庫url、數(shù)據(jù)庫用戶名、密碼、JDBC驅(qū)動(dòng)類、dialect(適配器) //Configuration Hibernate會(huì)自動(dòng)在當(dāng)前的classpath中搜尋hibernate.cfg.xml文件并將其加載至內(nèi)存中,作為后續(xù)操作的基礎(chǔ)配置 //Configuration類一般只有獲取SessonFacotry時(shí)需要涉及,當(dāng)SessionFactory實(shí)例創(chuàng)建之后, //由于配置信息已經(jīng)由Hibernate綁定在返回的SessionFactory中,因此一般情況下無需再對(duì)Configuration進(jìn)行操作 //如果不希望使用默認(rèn)的hibernate.cfg.xml文件作為配置文件,可以指定配置文件名 //File file=new File("C:\\sample\\myhibernate.cfg.xml"); //Configuration cofing=new Configuration().configure(file); Configuration config = new Configuration().configure(); //--------------------------SessionFactory基礎(chǔ)語義----------------------------- //SessionFactory負(fù)責(zé)創(chuàng)建session實(shí)例,可以通過Configuration實(shí)例構(gòu)建SessionFactory //Configuration實(shí)例config會(huì)根據(jù)當(dāng)前的數(shù)據(jù)庫配置信息,構(gòu)造SessionFactory實(shí)例并返回。 //SessionFactory一旦構(gòu)造完畢,即被賦予特定的配置信息! //也就是說,之后的config的任何改變將不會(huì)影響到已經(jīng)創(chuàng)建的SessionFacotry實(shí)例(factory) //SessionFactory是線程安全,可由多個(gè)線程并發(fā)調(diào)用 SessionFactory factory = config.buildSessionFactory(); //--------------------------Session基礎(chǔ)語義----------------------------------- //Session是Hibernate持久化操作的基礎(chǔ) session是非線程安全的 //也就是說一個(gè)session實(shí)例只可同時(shí)有一個(gè)線程調(diào)用,同一個(gè)session實(shí)例的多線程并發(fā)調(diào)用將導(dǎo)致不可預(yù)知的錯(cuò)誤 session = factory.openSession(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 與setUP相對(duì)應(yīng),TestCase執(zhí)行完畢時(shí),會(huì)自動(dòng)調(diào)用tearDown方法 一般用于資源釋放 * 此方法中用于關(guān)閉在setUp方法中打開的Hibernate Session */ protected void tearDown() { try { session.close(); } catch (HibernateException e) { e.printStackTrace(); } } /** * 對(duì)象持久化(Insert)方法 Junit中,以“test”作為前綴的方法為測(cè)試方法,將被Junit自動(dòng)添加到測(cè)試計(jì)劃中 */ public void testInsert() { Transaction tran = null; try { tran = session.beginTransaction(); Tuser user = new Tuser(); user.setName("zhangsan"); session.save(user); session.flush(); //把緩存中的數(shù)據(jù)刷新到數(shù)據(jù)庫 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(); } } } } /** * 對(duì)象讀?。╯elect)測(cè)試 */ 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 日出星辰 閱讀(72) 評(píng)論(0) 編輯 收藏