Hibernate學習筆記_02
上篇文章(傳送門:Hibernate學習筆記_01)介紹了Hibernate是什麽,如何搭建,配置文件詳解以及Hibernate的一些基本API詳解這幾個方面做了簡單介紹,那麽本文將會從一下5個方面記錄Hibernate的學習經歷:
1.hibernate中的實體規則
2.hibernate中的對象狀態
3.hibernate進階—— 一級緩存
4.hibernate中的事務
5.hibernate中的批量查詢(概述)
Ⅰ.Hibernate中的實體規則
在Hibernate使用中,需要創建與數據庫表對應的實體,並在映射文件中配置.在創建實體的時候需要註意一些細節.
(1)實體類創建時需要註意5個事項:
1.持久化類提供無參數構造
2.成員變量私有,提供共有get/set方法訪問.需提供屬性
3.持久化類中的屬性,應盡量使用包裝類型
4.持久化類需要提供oid.與數據庫中的主鍵列對應
5.不要用final修飾class(hibernate使用cglib代理生成代理對象.代理對象是繼承被代理對象.如果被final修飾.將無法生成代理.)
(2)主鍵類型
自然主鍵(少見):表的業務列中,有某業務列符合,必須有,並且不重復的特征時,該列可以作為主鍵使用.
代理主鍵(常見):表的業務列中,沒有某業務列符合,必須有,並且不重復的特征時,創建一個沒有業務意義的列作為主鍵.
(3)主鍵生成策略
代理主鍵
identity : 主鍵自增.由數據庫來維護主鍵值.錄入時不需要指定主鍵.
sequence: Oracle中的主鍵生成策略.
increment: 主鍵自增.由hibernate來維護.每次插入前會先查詢表中id最大值.+1作為新主鍵值.
hilo: 高低位算法.主鍵自增.由hibernate來維護.開發時不使用.
native:hilo+sequence+identity 自動三選一策略.
uuid: 產生隨機字符串作為主鍵. 主鍵類型必須為string 類型.
在實際的開發過程中可以根據需要來選擇合適的主鍵生成策略,一般來說比叫常見的是使用native,通常是在實體xxx.hbn.xml中<generator class="native"></generator>屬性中配置
自然主鍵
assigned:自然主鍵生成策略. hibernate不會管理主鍵值.由開發人員自己錄入.
Ⅱ.Hibernate中對象的狀態
在Hibernate中,對象通常分為三種狀態:
1.瞬時狀態
沒有id,沒有在session緩存中
1 public void fun1() { 2 // 1.獲得session 3 Session session = HibernateUtils.openSession(); 4 // 2.控制事務 5 Transaction tx = session.beginTransaction(); 6 // 3.執行操作 7 Customer c = new Customer(); // 沒有id,沒有在session緩存中 ==> 瞬時狀態 8 9 c.setCust_name("惠普"); // 瞬時狀態 10 11 session.save(c); // 持久化狀態,有id,在session緩存中 12 // 4.提交事務 13 tx.commit(); 14 // 5.關閉資源 15 session.close(); // 遊離|脫管狀態 ,有id,沒有在session緩存中 16 }
2.持久化狀態
有id,在session緩存中
持久化狀態的特點: 持久化狀態的對象的任何變化都會同步到數據庫當中.
3.遊離|托管狀態
有id,沒有在session緩存中
在開發操作過程中,這三種狀態是可以互相轉變的
Ⅲ.Hibernate進階——一級緩存
通常情況下,緩存是為了提高效率,在大家最常見的電腦中,CPU也存在緩存,硬盤也存在緩存,內存中同樣也存在緩存,而hibernate中的一級緩存同樣也是為了提高操作數據庫的效率.
Hibernate中緩存提高效率的手段有兩種:
1.提高查詢效率
2.減少不必要的修改語句的發送
Ⅳ.Hibernate中的事務
大家都知道,事務有四大特性()ACID)分別是:
原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
事務並發帶來的問題有:1.臟讀、2.不可重復讀、3.幻|虛讀。
事務的隔離級別有四種情況:(後面的數字分別代表上面並發帶來的問題)
讀未提交- 123
讀已提交 - 23
可重復讀(mysql默認級別)-3
串行化 - 沒有問題
那麽如何在HIbernate中指定數據庫的隔離級別呢?只要在Hibernate.cfg.xml文件中增加如下一行配置即可
<!-- 指定Hibernate操作數據庫時的隔離級別 ## specify a JDBC isolation level #hibernate.connection.isolation 1|2|4|8 0001 1 讀未提交 0010 2 讀已提交 0100 4 可重復讀 1000 8 串行化 --> <property name="hibernate.connection.isolation">4</property>
那麽我們在項目中又該如何去管理事務呢?
業務開始之前打開事務,業務執行之後提交事務. 執行過程中出現異常.回滾事務.
在dao層操作數據庫需要用到session對象.在service控制事務也是使用session對象完成. 我們要確保dao層和service層使用的使用同一個session對象
在hibernate中,確保使用同一個session的問題,hibernate已經幫我們解決了. 我們開發人員只需要調用sf.getCurrentSession()方法即可獲得與當前線程綁定的session對象
註意1: 調用getCurrentSession方法必須配合主配置中的一段配置
<!-- 指定session與當前線程綁定 --> <property name="hibernate.current_session_context_class">thread</property>
註意2:通過getCurrentSession方法獲得的session對象.當事務提交時,session會自動關閉.不要手動調用close關閉.
在Service層
Dao層
Hibernate學習筆記_02