hibernate 概要

4, hibernate基礎
    4.1  hibernate基礎語義
        Configuration
            Configuration config = new Configuration().configure();
            File file = new File("c:\\sample\\myhibernate.xml");
            Configuration config = new Configuration().configure(file);
        SessionFactory
            Configuration config = new Configuration().configure();
            SessionFactory sessionFactory = config.buildSessionFactory();
            採用線程安全的設計,可由多個線程併發調用,大多情況下,一個應用中針對一個數據庫
            共享一個sessionFactory實例即可。
        Session
            非線程安全,一個session實例同時可有一個線程實用。
            Session session = sessionFactory.openSession();
            save,get,delete,find(hibernate2),hibernate3-->Query,Criteria
    4.2 基礎配置
        SessionFactory配置
            數據庫連接配置
            數據庫連接池的配置
                默認數據庫連接池
                    hibernate.connection.pool_size  2
                c3p0
                dbcp
                proxool
        事務管理
            使用jdbc的事務處理機制
                hibernate.transaction.factory_class
                    net.sf.hibernate.transaction.JDBCTransactionFactory
            實用JTA
                hibernate.transaction.factory_class
                    net.sf.hibernate.transaction.JTATransactionFactory
                jta.UserTransaction jta/usertransaction
            可選配置項
    4.3  hibernate O/R映射
        基本數據類型
        實體映射
            實體映射基礎
                表名--類名映射
                主鍵映射
                字段映射
        高級映射技術
            自定義數據類型
                UserType
                CompositeUserType
        複合主鍵
            基於實體類屬性的複合主鍵
        blob,clob字段的映射
        實體映射策略
    4.4 數據關聯
        一對一
            主鍵關聯
                1,一對一節點映射 , 級聯關係
                2,foreign主鍵生成,一對一映射節點,約束
            唯一外鍵關聯
                1,many-to-one,unique
                2,one-to-one

        一對多
            單向一對多,雙向一對多
        多對多
    4.5 hibernate數據檢索
        Criteria Query
            複合查詢:
                Criteria criteria = session.createCriteria(TUser.class);
                Criteria addrCriteria = criteria.createCriteria("address");
                addrCriteria.add(Expression.like("address","%ShangHai%"));
        DetachedCriteria
            脫離session。
            DetachedCriteria deCriteria = DetachedCriteria.forClass(TUser.class);
            deCriteria.add(Expression.eq("name","...."));

            DetachedCriteria criteria = deCriteria.getExecutableCriteria(session);
            可用於子查詢Subqueries.propertyGt("age",avgAge);

            Criteria高級特性:
                1,限定返回的記錄範圍
                    Criteria criteria = session.createCriteria(TUser.class);
                    criteria.setFirstResult(100);
                    criteria.setMaxResults(20);
                2,分組與統計
                    criteria.setProjection(Projections.groupProperty("age"));
        Hibernate Query Language
    4.6  HQL實用技術
        實體查詢
        屬性查詢
        實體更新與刪除
        分組與排序
        參數綁定
        引用查詢
            將sql保存在配置文件中,需要調用的時候進行讀取。
            Query query = session.getNamedQuery("queryByName");
        聯合查詢
        子查詢
        數據加載方式
        sql查詢
    4.7 自定義持久化實現
        <sql-insert>
5.    hibernate高級特性
    5.1 hibernate持久化實現
        實體對象生命週期
        實體對象識別
        數據緩存
        hibernate數據緩存
            內部緩存又稱一級緩存

                由hibernate自身維護的。如果需要手動干預:
                    session.evict
                    session.clear
            二級緩存

                可納入緩存管理中的條件:
                    1,數據不會被第三方應用修改
                    2,數據大小在可接受的範圍之內
                    3,數據更新率較低
                    4,同一數據可能會被系統頻繁使用
                    5,非關鍵數據

        事務管理
            基於jdbc事務管理
            基於jta事務管理
                jta提供了跨session的事務管理能力,管理多個session的事務
        悲觀鎖(....for update 依靠數據庫的鎖機制實現)
            Criteria.setLockMode
            Query.setLockMode
            Session.lock
        樂觀鎖(鑑於悲觀鎖對數據庫性能的大量開銷,特別是長事務而言。)
            version----比較版本號,提交版本>當前版本,才予以提交。
        
        持久層操作
            數據加載
                session.get/load
                session.find/iterate(2)//session.createQuery().list()/session.createQuery().iterate()(3)

                iterate會先找出id,然後從中找相符的記錄。n+1條sql。但它會先去緩存(find出的記錄)中讀取,
                    這時候也許就是很少的select語句了。

                海量數據的操作:
                    while(it.hasNext()){
                        TUser user = (TUser)it.next();
                        session.evict(user);
                        sessionFactory.evict(TUser.class,user.getId());
                    }
        Query Cache
            保存了之前查詢操作執行過的select SQL,以及由此查詢產生 的查詢結果集。
            如果數據表發生了變化,會自動將Query Cache中對應表的sql緩存廢除。

            只在特定的情況下產生:
                1,完全相同的select sql重複執行
                2,在兩次查詢之間,此select sql對應的庫表沒有發生過變化。
            如果要應用它,在配置文件中配置:    
                <session-facotry>
                    <property name = "hibernate.cache.use_query_cache">true</property>
                </session-factory>
                之後我們在查詢執行之前,query.setCacheable(true);

        延遲加載
            實體對象的延遲加載
                hibernate中引入了CGLib作爲代理機制實現的基礎,其基本實現原理就是通過
                有CGLib構造一個包含目標對象所有屬性和方法的動態對象。通過一箇中間代理
                實現了數據延遲加載功能,只有當客戶程序真正調用實體類的取值方法時,hibernate
                纔會執行數據庫查詢操作。
            集合類型的延遲加載
                Collection addSet = user.getAddresses();  1
                Iterator it = addSet.iterator();  2

                代碼運行至2,真正的數據讀取操作纔開始執行。

                hibernate 對集合類型的緩存時,首先是這個集合中所有實體的id列表(數據所有)
                然後是各個實體對象。
                <cache usage="read-only/read-write">
                read-only(數據索引,不會將集合中的實體元素同時納入緩存)
                read-write(實體元素也納入緩存)
            屬性延遲加載
                配置,hibernate3中還需藉助類增強器對二進制class文件進行強化處理。

        數據保存
            session.save  會去內部緩存中查找。
            session.update  detached---->persistent
            session.saveOrUpdate
        數據批量操作
            數據批量導入
                <property name = "hibernate.jdbc.batch_size">25</property>
            數據批量刪除
                找出符合的id,再循環根據id刪除,爲了記錄狀態,刪除了那些記錄才這樣做的。
                這樣導致了幾個問題:
                1)內存消耗,因爲首先必須將所有符合條件的數據加載到內存中。
                    遊標的hibernate批量刪除:
                        Query query = session.createQuery(hql);
                        ScrollableResults scRes = query.scroll();
                        while(scRes.next()){....}
                2)迭代刪除操作的執行效率
                    調整hibernate.jdbc.batch_size參數解決

            無法保證緩存數據的一致有效性。
    Collection類型

        Set  如果做刪除操作,會刪去符合條件的所有記錄,但是我們只想刪除特定的記錄,那麼bag
        Bag 無序可重複(set,list)  先全部刪除,然後插入。
        idbag----collection-id
        Map
        List
5.2    hibernate回調與攔截機制

        Interceptor 定義了hibernate中的通用攔截機制。session創建時即可以指定加載
        相應的interceptor,之後此session的持久化操作動作都將首先經由攔截器捕獲處理。
        SessionFactory sessionFactory = config.buildSessionFactory();
        Interceptor it = new MyInterceptor();
        session = sessionFactory.openSession(it);

5.3 hibernate 使用技術
        hibernate分頁
            setFirstResut   setFetchSize
            dialect:指定了所有底層數據庫的對外統一接口。
                實現getLimitString方法。
        Session管理
            ThreadLocal
        Hibernate與Spring Framework
        hibernate 常見優化策略
            1,最新的hibernate版本
            2,制定合理的緩存策略
            3,採用合理的session管理機制  ThreadLocal
            4,儘量使用延遲加載特性
            5,設定合理的批處理參數(batch_size)
            6,如果可能,選用uuid作爲主鍵生成器
            7,如果可能,選用基於version的樂觀鎖策略代替悲觀鎖
            8,開發過程中,打開hibernate.show_sql
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章