目錄
一、.Hibernate實體的創建規則
1.持久化類需要提供無參的構造方法
2.持久化類的屬性需要私有,對私有的屬性提供共有的get和set方法
3.持久化類的屬性,需要儘量使用包裝類型。因爲包裝類型和基本類型的默認值不同,比如:
4. 持久化類需要有一個唯一標識OID與表的主鍵對應 每個表都需要有主鍵
5.持久化類不要使用final來修飾-----hibernate使用cglib來生成代理對象,代理對象是繼承被代理對象的如果使用final修飾,將無法繼承。
二、hibernate主鍵生成策略
主鍵類型
自然主鍵:把具有業務含義的字段作爲主鍵,稱之爲自然主鍵,比如身份證號碼,電話號碼----少見 如果出現變更維護困難
代理主鍵:把不具備業務含義的字段作爲主鍵,稱之爲代理主鍵,字段一般取名爲id通常爲整數類型。
hibernate常用的主鍵生成策略
identity:主鍵自增,由數據庫來申城主鍵值,錄入時不需要指定主鍵
sequence:Oracle中的主鍵生成策略
increment:主鍵自增,由hibernate來維護,每次插入前都會查詢最大的id值+1作爲新的主鍵(開發中不使用,不安全)
hilo(瞭解):高低位算法,主鍵自增,由hibernate來維護,開發是不使用
native:hilo、sequence、identity自動三選一策略。自動識別數據庫選擇
uuid:產生隨機字符串作爲主鍵,主鍵類型必須爲string類型
assigned:自然主鍵生成策略。hibernate不會管理主鍵值,由開發人員自己錄入。
三、hibernate對象狀態
瞬時狀態 沒有id沒有和session關聯
持久化狀態 有id ,和session有關聯
遊離託管狀態 有id沒有和session關聯
/**
* 測試對象三種狀態
*/
@Test
public void test2(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//------數據庫操作
Customer c = new Customer(); //沒有id,沒有和session關聯==>瞬時狀態
c.setCust_name("好啊好啊"); //沒有id,沒有和session關聯==>瞬時狀態
session.save(c); //執行保存 //持久化狀態 有id,有關聯
//~~~~~~~~~~~~~~~~~~~
transaction.commit();//提交事務
//transaction.rollback();//回滾
session.close(); //遊離託管狀態 有id,沒有關聯
}
/**
* 三種狀態特點
* save方法,將瞬時狀態轉換成持久狀態
* 主鍵自增,執行save方法的時候,爲了將對象狀態轉換爲持久化狀態,必須生成id值,所以需要執行insert語句來生成id
*increment 執行save方法,爲了生成id會執行查詢最大id值的sql語句。
* */
@Test
public void test3(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//------數據庫操作
Customer c= new Customer(); //沒有id,沒有和session關聯==>瞬時狀態
c.setCust_name("好啊好啊"); //沒有id,沒有和session關聯==>瞬時狀態
session.save(c); //執行保存 //持久化狀態 有id,有關聯
//~~~~~~~~~~~~~~~~~~~
transaction.commit();//提交事務
//transaction.rollback();//回滾
session.close(); //遊離託管狀態 有id,沒有關聯
}
/**
* 三種狀態特點
* 持久化狀態特點:持久化狀態對象中的任何狀態都會自動同步到數據庫中
* */
@Test
public void test4(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//------數據庫操作
Customer c = session.get(Customer.class, 3); //持久化狀態 有id ,與session有關聯
c.setCust_name("xxx");
//session.save(c); //執行保存 //持久化狀態 有id,有關聯
//~~~~~~~~~~~~~~~~~~~
transaction.commit();//提交事務
//transaction.rollback();//回滾
session.close(); //遊離託管狀態 有id,沒有關聯
}
三種狀態的轉換圖
四、hibernate一級緩存
提高查詢效率
較少不必要的修改語句發送
五、指定hibernate操作數據庫的隔離級別
在主配置文件中指定
六、hibernate中的事務控制
業務在開始之前打開事務,業務執行完以後提交事務,執行過程中出現異常,則進行回滾
在dao層操作數據庫需要使用session,在對service控制事務的時候也需要使用session對象完成,需要確保到層和service層使用的是同一個session對象
在hibernate中確保使用同一個session的問題
注意1.需要在主配置文件中配置
<property name="hibernate.current_session_context_class">thread</property>
然後使用getcurrentsession方法
測試
//getCurrentSession返回同一個與線程綁定的session true
@Test
public void test2(){
Session s1 = HibernateUtils.getCurrentSession();
Session s2 = HibernateUtils.getCurrentSession();
System.out.println(s1==s2);
}
//返回不同的session false
@Test
public void test3(){
Session s1 = HibernateUtils.openSession();
Session s2 = HibernateUtils.openSession();
System.out.println(s1==s2);
}
注意2:通過getCurrentSession方法獲得的session對象,當提交事務後,session會自動關閉,切忌不需要手動調用close方法