<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    鷹翔宇空

    學習和生活

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
    原文引自:http://www.gamvan.com/developer/java/opener/2005/7/527.html
    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 
       <hibernate-configuration> 
     <session-factory> 
     …… 
      <property name="hibernate.cache.provider_class"> 
       net.sf.ehcache.hibernate.Provider 
      </property>  
      還需對ecache本身進配置 
      <ehcache> 
     <diskStore path="java.io.tmpdir"/> 
     <defaultCache 
     maxElementsInMemory="10000" //Cache中最大允許保存的數據數量 
     eternal="false" //Cache中數據是否為常量 
     timeToIdleSeconds="120" //緩存數據鈍化時間 
     timeToLiveSeconds="120" //緩存數據的生存時間 
     overflowToDisk="true" //內存不足時,是否啟用磁盤緩存 
     /> 
      </ehcache> 
      之后在映射文件中指定各個映射實體的cache策略 
      <class name=" org.hibernate.sample.TUser" .... > 
     <cache usage="read-write"/> 
     .... 
     <set name="addresses" .... > 
      <cache usage="read-only"/> 
     .... 
     </set> 
     </class> 
    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); 




    ……} 
    27.Spring的參數化事務管理功能相當強大,筆者建議在基于Spring Framework的應用 
    開發中,盡量使用容器管理事務,以獲得數據邏輯代碼的最佳可讀性。 
      
    public class UserDAO extends HibernateDaoSupport implements IUserDAO 

    public void insertUser(User user) { 
    getHibernateTemplate().saveOrUpdate(user); 



      上面的UserDAO實現了自定義的IUserDAO接口,并擴展了抽象類: 
    HibernateDaoSupport 
    HibernateSupport實現了HibernateTemplate和SessionFactory實例的關聯。 
    HibernateTemplate對Hibernate Session操作進行了封裝,而 
    HibernateTemplate.execute方法則是一封裝機制的核心 
      *在spring的配置文件里,移植了整個hibernate.cfg.xml的內容。
    posted on 2006-02-20 14:37 TrampEagle 閱讀(336) 評論(0)  編輯  收藏 所屬分類: 技術文摘
    主站蜘蛛池模板: 日本高清色本免费现在观看| 一色屋成人免费精品网站| 又粗又大又猛又爽免费视频| 亚洲精品国产摄像头| 女人18毛片水最多免费观看| 亚洲午夜一区二区三区| 成年女人18级毛片毛片免费观看| 亚洲午夜无码毛片av久久京东热 | 亚洲偷偷自拍高清| 暖暖在线日本免费中文| 色偷偷亚洲第一综合| 免费大黄网站在线观看| 久久久久免费视频| 亚洲欧洲国产精品你懂的| 91高清免费国产自产| 亚洲 日韩 色 图网站| 国产又大又粗又硬又长免费 | 亚洲熟妇AV一区二区三区浪潮| 免费毛片在线视频| 粉色视频在线观看www免费| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲成人国产精品| 免费看一区二区三区四区| 中文字幕亚洲色图| 成年人免费视频观看| 国产成人亚洲精品蜜芽影院| 国内精品久久久久久久亚洲| 久久综合国产乱子伦精品免费 | 亚洲国产成人精品无码一区二区| 人禽杂交18禁网站免费| MM1313亚洲国产精品| 不卡精品国产_亚洲人成在线| 日本免费一区二区三区| 一本色道久久88亚洲精品综合| 免费在线黄色网址| 无码av免费一区二区三区| 亚洲色最新高清av网站| 亚洲色WWW成人永久网址| 免费做爰猛烈吃奶摸视频在线观看 | 亚洲宅男天堂在线观看无病毒| 100部毛片免费全部播放完整|