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

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

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

    隨筆 - 6  文章 - 0  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(2)

    隨筆分類(lèi)

    文章分類(lèi)

    好友

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    原文:http://www.donews.net/dyhcn/
    1.兩種配置文件:
      A.hibernate.cfg.xml   和   B.hibernate.properties

      A中可含映射文件的配置,而B(niǎo)中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()
       強(qiáng)制數(shù)據(jù)庫(kù)立即同步,當(dāng)用事務(wù)時(shí),不必用flush,事務(wù)提交自動(dòng)調(diào)用flush
       在session關(guān)閉時(shí)也會(huì)調(diào)用flush


    4. Hibernate總是使用對(duì)象類(lèi)型作為字段類(lèi)型

    5. XDoclet專(zhuān)門(mén)建立了hibernate doclet,就是在java代碼上加上一些
       java docTag,后來(lái)再讓XDoclet分析該java代碼,生成映射文件;

    6.HQL子句本身大小寫(xiě)無(wú)關(guān),但是其中出現(xiàn)的類(lèi)名和屬性名必須注意大小寫(xiě)區(qū)分。

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

      property-ref:關(guān)聯(lián)類(lèi)中用于與主控類(lèi)相關(guān)聯(lián)的屬性名,默認(rèn)為關(guān)聯(lián)類(lèi)的主鍵屬性名

      單向一對(duì)多需在一方配置,雙向一對(duì)多需在雙方進(jìn)行配置

    8.lazy=false:被動(dòng)方的記錄由hibernate負(fù)責(zé)記取,之后存放在主控方指定的
      Collection類(lèi)型屬性中

    9. java.util.Set或net.sof.hibernate.collecton.Bag類(lèi)型的Collection


    10.重要:inverse:用于標(biāo)識(shí)雙向關(guān)聯(lián)中的被動(dòng)方一端。
             inverse=false的一方(主控方)負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系.默認(rèn)值:false

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

    12.一對(duì)多通過(guò)主控方更新(主控方為一方時(shí))

       user.getAddresses().add(addr);
       session.save(user);//通過(guò)主控對(duì)象級(jí)聯(lián)更新  

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


       addr.setUser(user);//設(shè)置關(guān)聯(lián)的TUser對(duì)象
       user.getAddresses().add(addr);
       session.save(user);//級(jí)聯(lián)更新 

    14.只有設(shè)為主控方的一方才關(guān)心(訪(fǎng)問(wèn))對(duì)方的屬性,被動(dòng)方是不關(guān)心對(duì)方的屬性的。

    15.one-to-many與many-to-one節(jié)點(diǎn)的配置屬性不同:
       一對(duì)多關(guān)系多了lazy和inverse兩個(gè)屬性
       多對(duì)多節(jié)點(diǎn)屬性:column:中間映射表中,關(guān)聯(lián)目標(biāo)表的關(guān)聯(lián)字段
                       class:類(lèi)名,關(guān)聯(lián)目標(biāo)類(lèi)
                       outer-join:是否使用外聯(lián)接    

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


            column是設(shè)置關(guān)聯(lián)字段。


    16.多對(duì)多,注意兩方都要設(shè)置inverse和lazy,cascade只能設(shè)為insert-update
       多對(duì)多關(guān)系中,由于關(guān)聯(lián)關(guān)系是兩張表相互引用,因此在保存關(guān)系狀態(tài)時(shí)必須對(duì)雙方同時(shí)保存。

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

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

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

    18.對(duì)于save操作而言,如果對(duì)象已經(jīng)與Session相關(guān)聯(lián)(即已經(jīng)被加入Session的實(shí)體容器中),則無(wú)需進(jìn)行具體的操作。因?yàn)橹蟮腟ession.flush過(guò)程中,Hibernate
    會(huì)對(duì)此實(shí)體容器中的對(duì)象進(jìn)行遍歷,查找出發(fā)生變化的實(shí)體,生成并執(zhí)行相應(yīng)的update
    語(yǔ)句。

    19.如果我們采用了延遲加載機(jī)制,但希望在一些情況下,實(shí)現(xiàn)非延遲加
    載時(shí)的功能,也就是說(shuō),我們希望在Session關(guān)閉后,依然允許操作user的addresses
    屬性
    Hibernate.initialize方法可以通過(guò)強(qiáng)制加載關(guān)聯(lián)對(duì)象實(shí)現(xiàn)這一功能:
    這也正是我們?yōu)槭裁丛诰帉?xiě)POJO時(shí),必須用JDK Collection接口(如Set,Map),
    而非特定的JDK Collection實(shí)現(xiàn)類(lèi)(如HashSet、HashMap)申明Collection屬性的
    原因。

    20.事務(wù):從sessionFactory獲得session,其自動(dòng)提交屬性就已經(jīng)關(guān)閉(AutoCommit=false),此時(shí)若執(zhí)行了jdbc操作,如果不顯式調(diào)用session.BeginTransaction(),是不會(huì)執(zhí)行事務(wù)操作的。

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

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

    21.悲觀鎖,樂(lè)觀鎖:
       樂(lè)觀鎖一般通過(guò)version來(lái)實(shí)現(xiàn),注意version節(jié)點(diǎn)必須出現(xiàn)在id后。


    22.Hibernate中,可以通過(guò)Criteria.setFirstResult和Criteria.setFetchSize方法設(shè)定分頁(yè)范圍。
       Query接口中也提供了與其一致的方法,hibernate主要在dialect類(lèi)中實(shí)現(xiàn)在這個(gè)功能。


    23.cache
       <hibernate-configuration>
     <session-factory>
     ……
      <property name="hibernate.cache.provider_class">
       net.sf.ehcache.hibernate.Provider
      </property> 

      還需對(duì)ecache本身進(jìn)配置
      <ehcache>
     <diskStore path="java.io.tmpdir"/>
     <defaultCache
     maxElementsInMemory="10000" //Cache中最大允許保存的數(shù)據(jù)數(shù)量
     eternal="false" //Cache中數(shù)據(jù)是否為常量
     timeToIdleSeconds="120" //緩存數(shù)據(jù)鈍化時(shí)間
     timeToLiveSeconds="120" //緩存數(shù)據(jù)的生存時(shí)間
     overflowToDisk="true" //內(nèi)存不足時(shí),是否啟用磁盤(pán)緩存
     />
      </ehcache>

      之后在映射文件中指定各個(gè)映射實(shí)體的cache策略
      <class name=" org.hibernate.sample.TUser" .... >
     <cache usage="read-write"/>
     ....
     <set name="addresses" .... >
      <cache usage="read-only"/>
     ....
     </set>
     </class>

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

     也就是說(shuō),對(duì)于list 操作,需要一條SQL 完成。而對(duì)于iterate 操作,需要n+1
    條SQL。,list方法將不會(huì)從Cache中讀取數(shù)據(jù)。iterator卻會(huì)。


    24.ThreadLocal:它會(huì)為每個(gè)線(xiàn)程維護(hù)一個(gè)私有的變量空間。實(shí)際上,
    其實(shí)現(xiàn)原理是在JVM 中維護(hù)一個(gè)Map,這個(gè)Map的key 就是當(dāng)前的線(xiàn)程對(duì)象,而value則是
    線(xiàn)程通過(guò)ThreadLocal.set方法保存的對(duì)象實(shí)例。當(dāng)線(xiàn)程調(diào)用ThreadLocal.get方法時(shí),
    ThreadLocal會(huì)根據(jù)當(dāng)前線(xiàn)程對(duì)象的引用,取出Map中對(duì)應(yīng)的對(duì)象返回。

     這樣,ThreadLocal通過(guò)以各個(gè)線(xiàn)程對(duì)象的引用作為區(qū)分,從而將不同線(xiàn)程的變量隔離開(kāi)
    來(lái)。


    25.Hibernate官方開(kāi)發(fā)手冊(cè)標(biāo)準(zhǔn)示例:
      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.通過(guò)filter實(shí)現(xiàn)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的參數(shù)化事務(wù)管理功能相當(dāng)強(qiáng)大,筆者建議在基于Spring Framework的應(yīng)用
    開(kāi)發(fā)中,盡量使用容器管理事務(wù),以獲得數(shù)據(jù)邏輯代碼的最佳可讀性。
     
    public class UserDAO extends HibernateDaoSupport implements IUserDAO
    {
    public void insertUser(User user) {
    getHibernateTemplate().saveOrUpdate(user);
    }
    }


      上面的UserDAO實(shí)現(xiàn)了自定義的IUserDAO接口,并擴(kuò)展了抽象類(lèi):
    HibernateDaoSupport
    HibernateSupport實(shí)現(xiàn)了HibernateTemplate和SessionFactory實(shí)例的關(guān)聯(lián)。
    HibernateTemplate對(duì)Hibernate Session操作進(jìn)行了封裝,而
    HibernateTemplate.execute方法則是一封裝機(jī)制的核心

      *在spring的配置文件里,移植了整個(gè)hibernate.cfg.xml的內(nèi)容。

    posted on 2006-03-16 11:48 badboy 閱讀(203) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Framework
    主站蜘蛛池模板: 99久久精品日本一区二区免费| 国产V片在线播放免费无码| 91精品国产免费网站| 久久亚洲精品AB无码播放| 成人无码区免费A∨直播| 亚洲色WWW成人永久网址| 中文字幕乱码免费看电影| 相泽亚洲一区中文字幕| 中文字幕无码免费久久9一区9 | 国产日韩精品无码区免费专区国产| 免费国产在线观看老王影院| 亚洲国产精品99久久久久久 | 久久精品女人天堂AV免费观看| 亚洲乱码在线卡一卡二卡新区| 成人性生免费视频| 特级毛片免费播放| 亚洲成人动漫在线| 午夜精品一区二区三区免费视频| 亚洲成a人片在线观看中文动漫| 免费专区丝袜脚调教视频| 亚洲午夜福利在线视频| www.亚洲色图| 日韩免费在线视频| 亚洲18在线天美| 亚洲人成无码网站久久99热国产| 免费久久人人爽人人爽av| 亚洲AV综合色区无码二区爱AV| 国产精品99久久免费| 免费观看一区二区三区| 亚洲国产av美女网站| 亚洲av午夜精品一区二区三区| 久久久久久久99精品免费观看| 亚洲国产精品一区二区第四页| 久操视频在线免费观看| 亚洲综合欧美色五月俺也去 | 久久亚洲国产精品一区二区| 国产麻豆视频免费观看| 又粗又长又爽又长黄免费视频| 亚洲色av性色在线观无码| 日本成人免费在线| 一级毛片不卡片免费观看|