Yako

          ---尋找java

          轉載:hibernate要點

          hibernate要點

          關鍵詞hibernate                                          

          1.兩種配置文件:
            A.hibernate.cfg.xml   和   B.hibernate.properties

            A中可含映射文件的配置,而B中hard codes加映射文件。

            A。Configuration config=new Configuration().config();
            B. Configuration config=new Configuration();
               config.addClass(TUser.class);


          2.你不必一定用hibernate.cfg.xml或hibernate.properties這兩文件名,
             你也不一定非得把配置文件放在Classes下,
             File file=new File("c:\\sample\\myhibernate.xml");
             Configuration config=new Configuration().config(file);

          3. session.Flush()
             強制數據庫立即同步,當用事務時,不必用flush,事務提交自動調用flush
             在session關閉時也會調用flush


          4. Hibernate總是使用對象類型作為字段類型

          5. XDoclet專門建立了hibernate doclet,就是在java代碼上加上一些
             java docTag,后來再讓XDoclet分析該java代碼,生成映射文件;

          6.HQL子句本身大小寫無關,但是其中出現的類名和屬性名必須注意大小寫區分。

          7.關系:
            Constrained : 約束,表明主控表的主鍵上是否存在一個外鍵(foreigh key)
             對其進行約束。

            property-ref:關聯類中用于與主控類相關聯的屬性名,默認為關聯類的主鍵屬性名

            單向一對多需在一方配置,雙向一對多需在雙方進行配置

          8.lazy=false:被動方的記錄由hibernate負責記取,之后存放在主控方指定的
            Collection類型屬性中

          9. java.util.Set或net.sof.hibernate.collecton.Bag類型的Collection


          10.重要:inverse:用于標識雙向關聯中的被動方一端。
                   inverse=false的一方(主控方)負責維護關聯關系.默認值:false

          11.batch-size:采用延遲加載特征時,一次讀入的數據數昨。

          12.一對多通過主控方更新(主控方為一方時)

             user.getAddresses().add(addr);
             session.save(user);//通過主控對象級聯更新  

          13.在one-to-many 關系中,將many 一方設為主動方(inverse=false)將有助性能
             的改善。在一方設置關系時,inverse=true,即將主控權交給多方,
             這樣多方可主動從一方獲得foreign key,然后一次insert即可完工。


             addr.setUser(user);//設置關聯的TUser對象
             user.getAddresses().add(addr);
             session.save(user);//級聯更新 

          14.只有設為主控方的一方才關心(訪問)對方的屬性,被動方是不關心對方的屬性的。

          15.one-to-many與many-to-one節點的配置屬性不同:
             一對多關系多了lazy和inverse兩個屬性
             多對多節點屬性:column:中間映射表中,關聯目標表的關聯字段
                             class:類名,關聯目標類
                             outer-join:是否使用外聯接    

             注意:access是設置屬性值的讀取方式。


                  column是設置關聯字段。


          16.多對多,注意兩方都要設置inverse和lazy,cascade只能設為insert-update
             多對多關系中,由于關聯關系是兩張表相互引用,因此在保存關系狀態時必須對雙方同時保存。

             group1.getRoles().add(role1);
             role1.getGroups().add(group1);

             session.save(role1);
             session.save(group1);

          17.關于vo和po
             vo經過hibernate容量處理,就變成了po(該vo的引用將被容器保存,并且在session關閉時flush,因此po如果再傳到其它地方改變了,就危險了)
           
             vo和po相互轉換:BeanUtils.copyProperties(anotherUser,user);

          18.對于save操作而言,如果對象已經與Session相關聯(即已經被加入Session的實體容器中),則無需進行具體的操作。因為之后的Session.flush過程中,Hibernate
          會對此實體容器中的對象進行遍歷,查找出發生變化的實體,生成并執行相應的update
          語句。

          19.如果我們采用了延遲加載機制,但希望在一些情況下,實現非延遲加
          載時的功能,也就是說,我們希望在Session關閉后,依然允許操作user的addresses
          屬性
          Hibernate.initialize方法可以通過強制加載關聯對象實現這一功能:
          這也正是我們為什么在編寫POJO時,必須用JDK Collection接口(如Set,Map),
          而非特定的JDK Collection實現類(如HashSet、HashMap)申明Collection屬性的
          原因。

          20.事務:從sessionFactory獲得session,其自動提交屬性就已經關閉(AutoCommit=false),此時若執行了jdbc操作,如果不顯式調用session.BeginTransaction(),是不會執行事務操作的。

             jdbc transaction:基于同一個session(就是同一個connection)的事務;
             jta  transaction:跨session(跨connection)事務.

             對于jta事務,有三種實現方法:
               A。UserTransaction tx=new InitialContext().lookup("...");
                  tx.commit();
               B. 使用hibernate封裝的方法:(不推薦)
                  Transaction tx=session.beginTransaction();
                  tx.commit();
               C. 使用ejb之sessionBean的事務技持方法,你只要在把需要在發布描述符中,把需要jta事務的方法聲明為require即可

          21.悲觀鎖,樂觀鎖:
             樂觀鎖一般通過version來實現,注意version節點必須出現在id后。


          22.Hibernate中,可以通過Criteria.setFirstResult和Criteria.setFetchSize方法設定分頁范圍。
             Query接口中也提供了與其一致的方法,hibernate主要在dialect類中實現在這個功能。


          23.cache
            
           
           ……
            
             net.sf.ehcache.hibernate.Provider
            
           

            還需對ecache本身進配置
           
           
            maxElementsInMemory="10000" //Cache中最大允許保存的數據數量
           eternal="false" //Cache中數據是否為常量
           timeToIdleSeconds="120" //緩存數據鈍化時間
           timeToLiveSeconds="120" //緩存數據的生存時間
           overflowToDisk="true" //內存不足時,是否啟用磁盤緩存
           />
           

            之后在映射文件中指定各個映射實體的cache策略
           
           
           ....
           
            
           ....
           

           

           *****************************************************
           Query.list()跟Query.iterate()的不同:
           對于query.list()總是通過一條sql語句獲取所有記錄,然后將其讀出,填入pojo返回;
           但是query.iterate(),則是首先通過一條Select SQL 獲取所有符合查詢條件的記錄的
          id,再對這個id 集合進行循環操作,通過單獨的Select SQL 取出每個id 所對應的記
          錄,之后填入POJO中返回。

           也就是說,對于list 操作,需要一條SQL 完成。而對于iterate 操作,需要n+1
          條SQL。,list方法將不會從Cache中讀取數據。iterator卻會。


          24.ThreadLocal:它會為每個線程維護一個私有的變量空間。實際上,
          其實現原理是在JVM 中維護一個Map,這個Map的key 就是當前的線程對象,而value則是
          線程通過ThreadLocal.set方法保存的對象實例。當線程調用ThreadLocal.get方法時,
          ThreadLocal會根據當前線程對象的引用,取出Map中對應的對象返回。

           這樣,ThreadLocal通過以各個線程對象的引用作為區分,從而將不同線程的變量隔離開
          來。


          25.Hibernate官方開發手冊標準示例:
            public class HibernateUtil {
          private static SessionFactory sessionFactory;
          static {
          try {
          // Create the SessionFactory
          sessionFactory = new
          Configuration().configure().buildSessionFactory();
          } catch (HibernateException ex) {
          throw new RuntimeException(
          "Configuration problem: " + ex.getMessage(),
          ex
          );
          }
          }
          public static final ThreadLocal session = new ThreadLocal();
          public static Session currentSession() throws HibernateException
          {
          Session s = (Session) session.get();
          // Open a new Session, if this Thread has none yet
          if (s == null) {
          s = sessionFactory.openSession();
          session.set(s);
          }
          return s;
          }
          public static void closeSession() throws HibernateException {
          Session s = (Session) session.get();
          session.set(null);
          if (s != null)
          s.close();
          }


              
          26.通過filter實現session的重用:
             public class PersistenceFilter implements Filter
          {
          protected static ThreadLocal hibernateHolder = new ThreadLocal();
          public void doFilter(ServletRequest request, ServletResponse
          response, FilterChain chain)
          throws IOException, ServletException
          {
          hibernateHolder.set(getSession());
          try
          {
          ……
          chain.doFilter(request, response);
          ……
          }
          finally
          {
          Session sess = (Session)hibernateHolder.get();
          if (sess != null)
          {
          hibernateHolder.set(null);
          try
          {
          sess.close();
          }
          catch (HibernateException ex) {
          throw new ServletException(ex);
          }
          }
          }
          }
          ……}

          posted on 2006-01-08 20:09 Yako的Java天地 閱讀(221) 評論(0)  編輯  收藏 所屬分類: 轉載好文


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2006年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 壤塘县| 天水市| 德清县| 临泉县| 富民县| 塘沽区| 九台市| 津市市| 将乐县| 集安市| 昌黎县| 儋州市| 醴陵市| 延寿县| 安多县| 岳阳县| 仙游县| 保山市| 武平县| 麟游县| 沂南县| 石景山区| 辛集市| 都昌县| 双桥区| 伊通| 朝阳市| 芜湖市| 筠连县| 昭平县| 万山特区| 博客| 苏尼特左旗| 吉首市| 章丘市| 牡丹江市| 河曲县| 深水埗区| 清涧县| 汤阴县| 鸡西市|