【Hibernate】--實體狀體與主鍵生成策略

一、Hibernate三種狀態

(1).瞬時狀態(只存在Hibernate容器中,數據庫中沒有與之對應的記錄)

  • A.通過new實例化的實體,在沒有執行save方法時。
  • B.持久狀態調用delete方法後。

(2).持久狀態(數據庫中已近存在,而且當前頁存在Hibernate容器中)

  • A.瞬時狀態調用save方法後,沒有提交事務的實體。
  • B.通過hibernate查詢進入Hibernate容器中的實體。

(3).脫管狀態/遊離狀態(當實體脫離hibernate容器管理,數據庫有與之對應的記錄)

  • A.當持久狀態對象在事務提交、session執行close、clear、evict。
  • B.通過update、updateOrSave、lock等方法可以變爲持久狀態。

二、openSession()和getCurrentSession()的區別和優缺點。

1.currentSession在Hibernate.cfg.xml中的配置:
<!-- 
  	將session和當前線程綁定,不用每次都通過sessionFactory獲取session,thread使用的是JDBC事務,jta使用全局事務
   -->
  <property name="current_session_context_class">thread</property>

java中測試方法
public void testCurrentSession(){
		//需要在hibernate配置文件中添加current_session_context_class
		//getCurrentSession獲取當前線程中的session,並且不用手動打開和關閉,也不需要手動設置事務
		Session s = session.getCurrentSession();
//		Transaction tran = s.beginTransaction();
		Student stu = new Student();
		stu.setSname("張三丰");
		s.save(stu);
//		tran.commit();
		//這裏不需要手動關閉,hibernate容器會管理session的狀態
//		s.close();
	}

區別及優缺點參考博文:點擊打開鏈接

三、主鍵生生成策略

  1. Assigned:有程序生成主鍵值,在save之前指定,否則會拋出異常。
    特點:主鍵由用戶指定,與頂層數據庫無關,用戶需要維護主鍵值,在調用save方法前指定主鍵,
    注意:有程序指定主鍵,如果是int類型的屬性不指定值默認會自動增長 (Integer等封裝類型都需要指定屬性值)。
  2. Hilo:使用高地位算法生成主鍵
    特點:需要二外表支持,能保證同一數據庫中主鍵的唯一性,當不能保證多個數據庫之間主鍵的唯一性,由hibernate維護與底層數據庫無關。
    注意:不能手動修改,否則會拋異常。
  3. Increment:對主鍵採取自增的方式生成新的主鍵,需要底層數據庫支持Sequence,如Oracle、DB2。
    特點:hibernate本身維護,適用於所有數據庫。
    注意:不適合於多併發的數據庫,適合單一進程訪問,不能用於集羣環境。
  4. Identity: 根據底層數據庫來支持自動增長,不同數據庫用不同的增長方式。
    特點:與底層數據庫有關,適用MySQL、DB2、MSSQL,適用long、int、short類型生成唯一標識。
    注意:hibernate和用戶干涉,適用非常方便,但是程序在不同數據庫上移植比較麻煩。
  5. Sequence:需要底層數據庫支持Sequence方式,如Oracle數據庫等特點:需要底層數據庫支持序列,支持的數據庫有Oracle、PostgreSql、DB2、SAPDb等。
    注意:在不同數據庫之間移植,特別是不支持序列的數據庫上,需要修改配置文件。
  6. Native:生成方式會根據底層不同的數據庫選擇Identity、Sequence、Hilo主鍵生成方式。
    特點:更具不同的底層數據庫採用不同的生成方式,hibernate會更具底層數據庫採用不同的映射方式。
    注意:在項目中如果採用多個數據庫時,可以使用這種方式,方便程序移植。
  7. uuid:使用128位uuid算法生成主鍵,保證網絡環境下主鍵唯一,也能保證不同數據庫不同服務器下主鍵唯一。
    特點:能夠保證數據庫中主鍵唯一,生成的朱主鍵佔用比較多的存儲空間。
    注意:必須是一個字符串類型的,長度必須大於32.

    xml配置即說明如下:
     <id name="sid" type="java.lang.String" length="50">
        <column name="s_id" />
        <!-- assigned 有程序指定主鍵,如果是int類型的屬性不指定值默認會自動增長 
        <generator class="assigned"/>
         -->
         
         <!-- hilo 使用高地位算法生成主鍵 ,max_lo高位值 
        <generator class="hilo">
    	<param name="table">hi_value</param>
    	<param name="colum">next_hi</param>
    	<param name="max_lo">125</param>
        </generator>
        -->
        <!-- increment適用數據庫自增新的主鍵,如Oracle、DB2 
        <generator class="increment"/>
        -->
        
       <!-- identity根據底層數據庫來支持自動增長
        <generator class="identity"/>
         -->
         
        <!-- 需要底層數據庫支持Sequence方式 
        <generator class="sequence"/>
        -->
        
        <!-- 根據底層不同的數據庫選擇Identity、Sequence、Hilo主鍵生成方式 
        <generator class="native"/>
        -->
        
        <generator class="uuid.hex"/>
    </id>


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