Hibernate學習(二)
阿新 • • 發佈:2018-05-15
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學習(二)