1. 程式人生 > >Hibernate學習(二)

Hibernate學習(二)

ID ssi header tab 關閉 遊離 ble pre 持久化

一、Hibernate持久化狀態

瞬時態

瞬時態也稱為臨時態或者自由態,瞬時態的實例是由new命令創建、開辟內存空間的對象,不存在持久化OID(相當於鍵),尚未與Hibernate Session建立關聯,在數據中也沒有任何記錄,失去引用後被JVM回收。瞬時態對象在內存中是孤立存在的,與數據庫中的數據無任何關聯,僅僅是信息的載體。

持久態

持久態的對象存在持久化的標識OID,加入Session緩存中,並且相關聯的Session沒有關閉,在數據庫中有相應的記錄,每條記錄只對應唯一的持久化對象,需要註意的是,持久態對象是在事物還未提交前變為持久態的。

托管態

托管態也稱為離線態或者遊離態,當某個持久化狀態的實例與Session的關聯被關閉時就變成了托管態。托管態對象存在持久化標識OID,並且仍然與數據庫中的數據存在關聯,只是失去了與當前Session的關聯,托管對象發生改變時Hibernate不能檢測到。

三種狀態的對比:

是否能在數據庫存在記錄 是否存在OID 是否由Session管理 是否能發sql語句
瞬時態
持久態
托管態

三種狀態的轉化圖:

技術分享圖片

二、Hibernate通過實體類建立數據庫表

Hibernate通過實體類建立數據庫表只需在Hibernate.cfg.xml文件中配置

<property name="hbm2ddl.auto">update</property>

這個配置還有其他參數:

  • create:啟動hibernate時,自動刪除原來的表,新建所有的表,所以每次啟動後的以前數據都會丟失。
  • create-drop:啟動hibernate時,自動創建表,程序關閉時,自動把相應的表都刪除。所以程序結束時,表和數據也不會再存在

三、遇到的問題

當使用上面的配置來創建數據庫表會顯示創建表的sql語句有問題。這時需要修改Hibernate.cfg.xml的配置。將

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

替換為

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

替換之後建表成功。

Hibernate學習(二)