hibernate 筆記

1SessionFactory

  1. 用來產生和管理session
  2. 通常情況下應用只需要一個SessionFactory(除非訪問多個數據庫的情況)
  3. 關注兩個方法 openSession getCurren tSession
    1. openSession 每次都是新的,需要close
    2. getCurrentSession 從上下文找,如果有,用舊的,如果沒有,建新的
      1. 用途,界定事物邊界
      2. 事物提交自動close
      3. current_session_context_class(jta(java transaction api) thread)
        1. thread 使用connection管理事物
        2. jta 用於分佈式事物(由中間件廠商提供

2、產生SessionFactorysession方法

Configurationconfig = new Configuration().configure();

ServiceRegistryresgistry = newStandardServiceRegistryBuilder().applySettings(config.getProperties()).build();

SessionFactorysf = config.buildSessionFactory(resgistry);

Sessionsession = sf.openSession();

3、對象的三種狀態

  1. 三種狀態的區分關鍵在於
    1. 有沒有ID
    2. ID在數據庫中有沒有
    3. 在內存中有沒有(session緩存)
  2. 三種狀態
    1. transient:內存中有對象,沒有ID,緩存中也沒有
    2. persistent:內存中有,緩存中有,數據庫有(ID)
    3. detached:內存中有,緩存沒有,數據庫有(ID)

4、get 和 load 的區別

  1. 不存在記錄時表現不一樣
  2. load 返回的是代理對象,等到真正用到對象的內容才發出sql語句
  3. get 直接從數據庫加載,不會延遲

5、update

  1. 用來更新detached對象,更新完後轉換爲persistent對象
  2. 更新transient對象會報錯
  3. 更新自己設定id的transient對象可以(數據庫存在該記錄)
  4. 更新部分更改的字段
    1. xml設定property標籤的update屬性,annotation設定@Column的updatable屬性,這種很少用,不靈活。
    2. 使用xml的dynamic-update,JPA1.0沒有對應的屬性
      1. 同一個session可以,跨session不行,可以使用merge
    3. 使用HQL(EJBQL建議),session.createQuery("")

6、clear、flush

  1. clear:無論是load還是get,都會首先查找緩存(一級緩存),如果沒有才回數據庫查找,調用clear可以強制清除session緩存
  2. flush:可以強制從內存到數據庫的同步

7、關聯關係中的CRUD

  1. 設定cascade可以設定在持久化時對關聯對象的操作
  2. cascade僅僅是幫我們省了編程的麻煩,不要把它的作用看的太大
    1. cascade屬性指明做什麼操作的時候關聯對象時綁在一起的
    2. merge=save+update
    3. refresh = A裏面需要讀B改過之後的數據
  3. 鐵律:雙向關係在程序中要設定雙向關聯
  4. 鐵律:雙向要設定mappedBy
  5. fetch
    1. 鐵律:雙向不要兩邊設置EAGER(會有多餘的查詢語句發出)
    2. 對多方設置EAGER要謹慎,結合具體應用,一般用LAZY不用EAGER;特殊情況(多的一方數量不多的時候可以考慮,可以提高效率)
  6. 要想刪除或更新,先做load,除了精確知道ID之外
  7. 如果想消除關聯關係,先設定關聯爲null,在刪除對應記錄,如果不刪除,就變爲垃圾數據
  8. O/RMapping編程模型
    1. 映射模型
      1. jpa annotation
      2. hibernate annotation extension
      3. hibernate xml
      4. jpa xml
    2. 編程接口
      1. jpa
      2. Hibernate
    3. 數據查詢語言
      1. HQL
      2. EJBQL

8、1+N問題

  1. lazy、BatchSize、join Fetch

9、list和iterate區別

  1. list取所有
  2. iterate先取ID,用到時在根據ID來取對象
  3. session中,list第二次發出,仍會查詢數據庫
  4. list第二次發出,首先找session緩存

10、一級緩存、二級緩存和查詢緩存

  1. 什麼是緩存? 在內存中開闢一塊空間
  2. 什麼是一級緩存? session級別的緩存
  3. 什麼是二級緩存? SessionFactory級別的緩存,可以跨越session的存在
    1. 打開二級緩存
      1. xml配置
        1. 3.3的配置:

<propertyname="catch.use_second_level_catch">true</property>

           <propertyname="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

4.3的配置:

<propertyname="cache.use_second_level_cache">true</property>

<propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

  1. 註解@Cache
  1. 什麼數據適合放二級緩存
    1. 經常被訪問的數據
    2. 改動不大的數據
    3. 數據量不大的數據
  2. load默認使用二級緩存,iterate默認也使用二級緩存
  3. list默認往二級緩存加數據,但是查詢的時候不用
  4. 要用查詢表緩存(query),必須打開二級緩存,查詢緩存配置
    1. <property name="hibernate.cache.use_query_cache">true</property>
    2. 調用Query的setCacheable(true)方法指明使用查詢緩存
  5. 緩存算法
    1. LRU、LFU、FIFO
      1. Least Recently Used
      2. Least Frequently Used(命中率最高)
      3. First In First Out
    2. 設置:meneoryStoreEvictionPolicy="LRU"(ehcache)

11、事務併發處理

  1. 事務ACID
  2. 悲觀鎖(使用數據庫的鎖 FOR UPDATE)
  3. 樂觀鎖,使用程序的鎖(@version),版本控制


發佈了48 篇原創文章 · 獲贊 15 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章