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
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.