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

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

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

    blogjava's web log

    blogjava's web log
    ...

    hibernate要點

    原文:http://blog.csdn.net/sunsnow8/archive/2005/03/05/312359.aspx

    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的內容。


    原文:http://blog.csdn.net/sunsnow8/archive/2005/03/05/312359.aspx

    posted on 2006-03-27 11:27 record java and net 閱讀(485) 評論(0)  編輯  收藏 所屬分類: java

    導航

    常用鏈接

    留言簿(44)

    新聞檔案

    2.動態語言

    3.工具箱

    9.文檔教程

    友情鏈接

    搜索

    最新評論

    主站蜘蛛池模板: 亚洲av无码一区二区三区天堂古代 | 亚洲av中文无码乱人伦在线观看| 一区二区三区观看免费中文视频在线播放 | h视频在线免费看| 亚洲伊人久久大香线焦| 在免费jizzjizz在线播| 亚洲成a人片在线网站| 美女裸身网站免费看免费网站| 亚洲精品电影在线| 免费国产成人高清在线观看网站| 亚洲一区电影在线观看| 97人伦色伦成人免费视频| 亚洲国产系列一区二区三区| 女人张开腿给人桶免费视频 | 亚洲AV成人片色在线观看高潮| 国产精品区免费视频| 亚洲五月六月丁香激情| 91短视频在线免费观看| 亚洲国产成人精品激情| 性做久久久久免费看| 国产高潮久久免费观看| 亚洲av色福利天堂| 两性刺激生活片免费视频| 狠狠入ady亚洲精品| 亚洲国产婷婷六月丁香| 日本免费一区二区在线观看| 亚洲精品无码少妇30P| 亚洲成av人片天堂网老年人 | 在线视频观看免费视频18| 羞羞漫画页面免费入口欢迎你| 中文字幕在线亚洲精品| 久久久久久免费视频| 美女视频黄频a免费观看| 亚洲国产香蕉碰碰人人| 免费看的成人yellow视频| 国产精品美女久久久免费| 2020天堂在线亚洲精品专区| 亚洲欧洲中文日韩久久AV乱码| 91香蕉在线观看免费高清| WWW国产亚洲精品久久麻豆| 亚洲高清视频在线观看|