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

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

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

    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本身進配置

     

     

     

    之后在映射文件中指定各個映射實體的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 2009-04-06 11:53 胡鵬 閱讀(210) 評論(0)  編輯  收藏 所屬分類: hibernate

    導航

    <2009年4月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    統計

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    agile

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲AV色无码乱码在线观看| 久久九九AV免费精品| 亚洲日本中文字幕区| 免费在线观看黄网| 无码精品A∨在线观看免费| 中文字幕一区二区免费| 免费的黄色的网站| 亚洲欧美日韩自偷自拍| 亚洲国产精品久久久久秋霞影院| 亚洲一区二区三区影院 | 国产亚洲色婷婷久久99精品91| 国产在线国偷精品产拍免费| 免费精品无码AV片在线观看| 国产视频精品免费视频| 男女啪啪免费体验区| 亚洲色最新高清av网站| 亚洲av极品无码专区在线观看| 亚洲欧洲日产国产综合网| 亚洲情综合五月天| 国产成人99久久亚洲综合精品| 在线免费观看韩国a视频| 全免费a级毛片免费看不卡| 亚洲男人天堂av| 亚洲国产精品尤物yw在线| 日韩成人免费视频播放| 好先生在线观看免费播放| 一二三四视频在线观看中文版免费 | 黄色视屏在线免费播放| 污污视频网站免费观看| 深夜A级毛片视频免费| 黄页网址大全免费观看12网站 | 亚洲成a人在线看天堂无码| 国产美女做a免费视频软件| 全免费a级毛片免费看无码| 日韩精品视频免费网址| 国产免费卡一卡三卡乱码| 日本不卡视频免费| 免费v片在线观看品善网| 亚洲精品国产自在久久| 久久精品国产亚洲Aⅴ香蕉| 亚洲熟妇中文字幕五十中出|