1、SessionFactory
- 用來產生和管理session。
- 通常情況下應用只需要一個SessionFactory(除非訪問多個數據庫的情況)
- 關注兩個方法 openSession getCurren tSession
- openSession 每次都是新的,需要close
- getCurrentSession
從上下文找,如果有,用舊的,如果沒有,建新的
- 用途,界定事物邊界
- 事物提交自動close
- current_session_context_class(jta(java transaction api)
thread)
- thread 使用connection管理事物
- jta 用於分佈式事物(由中間件廠商提供 )
2、產生SessionFactory與session方法
Configurationconfig = new Configuration().configure();
ServiceRegistryresgistry = newStandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactorysf = config.buildSessionFactory(resgistry);
Sessionsession = sf.openSession();
3、對象的三種狀態
- 三種狀態的區分關鍵在於
- 有沒有ID
- ID在數據庫中有沒有
- 在內存中有沒有(session緩存)
- 三種狀態
- transient:內存中有對象,沒有ID,緩存中也沒有
- persistent:內存中有,緩存中有,數據庫有(ID)
- detached:內存中有,緩存沒有,數據庫有(ID)
4、get 和 load 的區別
- 不存在記錄時表現不一樣
- load 返回的是代理對象,等到真正用到對象的內容才發出sql語句
- get 直接從數據庫加載,不會延遲
5、update
- 用來更新detached對象,更新完後轉換爲persistent對象
- 更新transient對象會報錯
- 更新自己設定id的transient對象可以(數據庫存在該記錄)
- 更新部分更改的字段
- xml設定property標籤的update屬性,annotation設定@Column的updatable屬性,這種很少用,不靈活。
- 使用xml的dynamic-update,JPA1.0沒有對應的屬性
- 同一個session可以,跨session不行,可以使用merge
- 使用HQL(EJBQL建議),session.createQuery("")
6、clear、flush
- clear:無論是load還是get,都會首先查找緩存(一級緩存),如果沒有才回數據庫查找,調用clear可以強制清除session緩存
- flush:可以強制從內存到數據庫的同步
7、關聯關係中的CRUD
- 設定cascade可以設定在持久化時對關聯對象的操作
- cascade僅僅是幫我們省了編程的麻煩,不要把它的作用看的太大
- cascade屬性指明做什麼操作的時候關聯對象時綁在一起的
- merge=save+update
- refresh = A裏面需要讀B改過之後的數據
- 鐵律:雙向關係在程序中要設定雙向關聯
- 鐵律:雙向要設定mappedBy
- fetch
- 鐵律:雙向不要兩邊設置EAGER(會有多餘的查詢語句發出)
- 對多方設置EAGER要謹慎,結合具體應用,一般用LAZY不用EAGER;特殊情況(多的一方數量不多的時候可以考慮,可以提高效率)
- 要想刪除或更新,先做load,除了精確知道ID之外
- 如果想消除關聯關係,先設定關聯爲null,在刪除對應記錄,如果不刪除,就變爲垃圾數據
- O/RMapping編程模型
- 映射模型
- jpa annotation
- hibernate annotation extension
- hibernate xml
- jpa xml
- 編程接口
- jpa
- Hibernate
- 數據查詢語言
- HQL
- EJBQL
- 映射模型
8、1+N問題
- lazy、BatchSize、join Fetch
9、list和iterate區別
- list取所有
- iterate先取ID,用到時在根據ID來取對象
- session中,list第二次發出,仍會查詢數據庫
- list第二次發出,首先找session緩存
10、一級緩存、二級緩存和查詢緩存
- 什麼是緩存? 在內存中開闢一塊空間
- 什麼是一級緩存? session級別的緩存
- 什麼是二級緩存? SessionFactory級別的緩存,可以跨越session的存在
- 打開二級緩存
- xml配置
- 3.3的配置:
- xml配置
- 打開二級緩存
<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>
- 註解@Cache
- 什麼數據適合放二級緩存
- 經常被訪問的數據
- 改動不大的數據
- 數據量不大的數據
- load默認使用二級緩存,iterate默認也使用二級緩存
- list默認往二級緩存加數據,但是查詢的時候不用
- 要用查詢表緩存(query),必須打開二級緩存,查詢緩存配置
- <property name="hibernate.cache.use_query_cache">true</property>
- 調用Query的setCacheable(true)方法指明使用查詢緩存
- 緩存算法
- LRU、LFU、FIFO
- Least Recently Used
- Least Frequently Used(命中率最高)
- First In First Out
- 設置:meneoryStoreEvictionPolicy="LRU"(ehcache)
- LRU、LFU、FIFO
11、事務併發處理
- 事務ACID
- 悲觀鎖(使用數據庫的鎖 FOR UPDATE)
- 樂觀鎖,使用程序的鎖(@version),版本控制