和風(fēng)細(xì)雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運(yùn)用之術(shù)自出。

          Hibernate的主要組件

          主要的Hibernate組件

          Configuration類

          Configuration類啟動(dòng)Hibernate的運(yùn)行環(huán)境部分,用于加載映射文件以及為它們創(chuàng)建一個(gè)SessionFacotry。完成這兩項(xiàng)功能后,就可丟棄Configuration類。

          // 從hibernate.cfg.xml創(chuàng)建SessionFactory 示例
          sessionFactory = new Configuration().configure()
          .buildSessionFactory();

          SessionFactory類

          Hibernate中Session表示到數(shù)據(jù)庫(kù)的連接(不止于此),而SessionFactory接口提供Session類的實(shí)例。
          SessionFactory實(shí)例是線程安全的,通常在整個(gè)應(yīng)用程序中共享。
          從Configuration創(chuàng)建SessionFacotry的代碼如右。

          // 從hibernate.cfg.xml創(chuàng)建SessionFactory 示例
          SessionFactory  sessionFactory = new Configuration().configure()
          .buildSessionFactory();

          Session類

          Session表示到數(shù)據(jù)庫(kù)的連接,session類的實(shí)例是到Hibernate框架的主要接口,使你能夠持久化對(duì)象,查詢持久化以及將持久化對(duì)象轉(zhuǎn)換為臨時(shí)對(duì)象。
          Session實(shí)例不是線程安全的,只能將其用于應(yīng)用中的事務(wù)和工作單元。
          創(chuàng)建Session實(shí)例的代碼如右:

          SessionFactory sessionFactory = new Configuration().configure()
          .buildSessionFactory();
          Session session=sessionFactory.openSession();

          保存一個(gè)對(duì)象

          用Hibernate持久化一個(gè)臨時(shí)對(duì)象也就是將它保存在Session實(shí)例中:
          對(duì)user實(shí)例調(diào)用save時(shí),將給該實(shí)例分配一個(gè)生成的ID值,并持久化該實(shí)例,在此之前實(shí)例的id是null,之后具體的id由生成器策略決定,如果生成器類型是assignd,Hibernate將不會(huì)給其設(shè)置ID值。
          Flush()方法將內(nèi)存中的持久化對(duì)象同步到數(shù)據(jù)庫(kù)。存儲(chǔ)對(duì)象時(shí),Session不會(huì)立即將其寫入數(shù)據(jù)庫(kù);相反,session將大量數(shù)據(jù)庫(kù)寫操作加入隊(duì)列,以最大限度的提高性能。

          User user=new User(“Andy”,22);
          Session session=sessionFatory.openSession();
          session.save(user);
          session.flush();
          session.close();

          保存或更新一個(gè)對(duì)象

          Hibernate提供了一種便利的方法用于在你不清楚實(shí)例對(duì)應(yīng)的數(shù)據(jù)在數(shù)據(jù)庫(kù)中的狀態(tài)時(shí)保存或更新一個(gè)對(duì)象,也就是說,你不能確定具體是要保存save還是更新update,只能確定需要把對(duì)象同步到數(shù)據(jù)庫(kù)中。這個(gè)方法就是saveOrUpdate。
          Hibernate在持久化時(shí)會(huì)查看實(shí)例的id屬性,如果其為null則判斷此對(duì)象是臨時(shí)的,在數(shù)據(jù)庫(kù)中找不到對(duì)應(yīng)的實(shí)例,其后選擇保存這個(gè)對(duì)象;而不為空時(shí)則意味著對(duì)象已經(jīng)持久化,應(yīng)該在數(shù)據(jù)庫(kù)中更新該對(duì)象,而不是將其插入。

          User user=。。。;
          Session session=sessionFatory.openSession();
          session.saveOrUpdate(user);
          Session.flush();
          session.close();

          刪除一個(gè)對(duì)象

          從數(shù)據(jù)庫(kù)刪除一個(gè)對(duì)象使用session的delete方法,執(zhí)行刪除操作后,對(duì)象實(shí)例依然存在,但數(shù)據(jù)庫(kù)中對(duì)應(yīng)的記錄已經(jīng)被刪除。

          User user=。。。;
          Session session=sessionFatory.openSession();
          session.delete(user);
          session.flush();
          session.close();

          以ID從數(shù)據(jù)庫(kù)中取得一個(gè)對(duì)象

          如果已經(jīng)知道一個(gè)對(duì)象的id,需要從數(shù)據(jù)庫(kù)中取得它,可以使用Session的load方法來返回它。代碼如右.
          注意此放在id對(duì)應(yīng)的記錄不存在時(shí)會(huì)拋出一個(gè)HibernateException異常,它是一個(gè)非檢查性異常。對(duì)此的正確處理是捕獲這個(gè)異常并返回一個(gè)null。
          使用此想法如果采用默認(rèn)的懶惰加載會(huì)導(dǎo)致異常,對(duì)此最簡(jiǎn)單的解決方案是把默認(rèn)的懶惰加載屬性修改為false。如右:

          User user=(User)session.load(User.class,"008");
          session.close();

          -----------------------------------------------

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <hibernate-mapping package="org.hibernate.auction">
          <class name="com.sitinspring.domain.User"
          table="USERTABLE_OKB" lazy="false">
          <id name="id" column="ID" >
          <generator class="uuid.hex"/>
          </id>
          。。。。
          </class>
          </hibernate-mapping>

          檢索一批對(duì)象

          檢索一批對(duì)象需要使用HQL,session接口允許你創(chuàng)建Query對(duì)象以檢索持久化對(duì)象,HQL是面向?qū)ο蟮模阈枰槍?duì)類和屬性來書寫你的HQL而不是表和字段名。
          從數(shù)據(jù)庫(kù)中查詢所有用戶對(duì)象如下:
          Query query=session.createQuery(“from User”);// 注意這里User是類名,from前沒有select。
          List<User> users=(List<User>)query.list();

          從數(shù)據(jù)庫(kù)中查詢名為“Andy”的用戶如下:
          String name=“Andy”;
          Query query=session.createQuery(“from User where name=‘”+name+”’”);
          List<User> users=(List<User>)query.list();

          以上方法類似于Statement的寫法,你還可以如下書寫:
          Query query=session.createQuery("from User  user where user.name = :name");
          query.setString("name", “Andy");
          List<User> users=(List<User>)query.list();

          posted on 2008-04-30 16:50 和風(fēng)細(xì)雨 閱讀(1266) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 南皮县| 郁南县| 铅山县| 资源县| 台东市| 弥渡县| 云和县| 黎平县| 林芝县| 运城市| 莒南县| 郴州市| 阳西县| 遂宁市| 汨罗市| 綦江县| 洱源县| 津市市| 乐平市| 桓仁| 芦山县| 湖南省| 弥勒县| 新乡县| 新巴尔虎右旗| 赤峰市| 若羌县| 博湖县| 太康县| 南皮县| 荥经县| 沭阳县| 澄迈县| 闸北区| 兴宁市| 南华县| 东乌| 陵川县| 青阳县| 建始县| 昂仁县|