Hibernate(2)實體對象

目錄

一、.Hibernate實體的創建規則

二、hibernate主鍵生成策略

三、hibernate對象狀態

四、hibernate一級緩存

五、指定hibernate操作數據庫的隔離級別

六、hibernate中的事務控制


 

 

 

一、.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方法

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章