hibernate對象生命周期.png
hibernate的實體對象分為三種狀態(tài):
- 瞬時狀態(tài)Transient:不納入session管理,數(shù)據(jù)庫中沒有對應記錄
- 持久狀態(tài)Persistent:納入session管理英支,數(shù)據(jù)庫中有對應記錄
- 游離狀態(tài)Detached:不納入session管理,數(shù)據(jù)庫中有對應記錄
下面根據(jù)上圖的各種狀態(tài)轉(zhuǎn)移展示一下代碼:
瞬時->持久->游離->持久
/**
* 測試對象三種狀態(tài)脚仔,解釋什么操作下狀態(tài)進行轉(zhuǎn)換
*
* 瞬時狀態(tài)Transient Objects 持久化狀態(tài)Persistent Objects 離線狀態(tài)Detached Objects
*/
public void test2() {
Session session = null;
User user1 = null, user2 = null;
try {
session = hibernateUtil.getSession();
session.beginTransaction();
// 現(xiàn)在是Transient狀態(tài)舟山,還沒有納入session管理,數(shù)據(jù)庫中也沒有對應的數(shù)據(jù)
user1 = new User();
user1.setUserName("張三");
user1.setPassWd("1234567");
user2 = new User();
user2.setUserName("李四");
user2.setPassWd("1234567");
// 當save保存后谣妻,對象變?yōu)镻ersistent狀態(tài),納入session管理卒稳,并且在數(shù)據(jù)庫中有對應的記錄
session.save(user1);
session.save(user2);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
// 當session關(guān)閉后蹋半,對象轉(zhuǎn)換為Detached狀態(tài)
hibernateUtil.closeSession(session);
}
// 這里開始第二個session
try {
session = hibernateUtil.getSession();
session.beginTransaction();
// 這里是Detached狀態(tài),session中沒有管理充坑,但是數(shù)據(jù)庫中有對應記錄
user1.setUserName("趙五");
// 顯示的調(diào)用update减江,調(diào)用完畢之后,user1對象又變成Persistent狀態(tài)
session.update(user1);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
hibernateUtil.closeSession(session);
}
}
4.png
load讀取出來的對象捻爷,直接就是Persistent狀態(tài)
/**
* 測試讀取辈灼,讀取出來的數(shù)據(jù)是persistent狀態(tài) load方法
*/
public void test3() {
Session session = null;
User user = null;
try {
session = hibernateUtil.getSession();
session.beginTransaction();
// 這里讀取出來一個persistent狀態(tài)的實體對象
user = (User) session.load(User.class, 1);
System.out.println("用戶名:" + user.getUserName());
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
hibernateUtil.closeSession(session);
}
}
load函數(shù)是cglib代理方式,延遲加載也榄,在函數(shù)調(diào)用的時候返回的是代理類型巡莹,不是實體類型司志,target是存儲真實數(shù)據(jù)的地方,剛開始是空的
5.png
這是延遲加載降宅,在實際使用的時候取回的數(shù)據(jù)保存位置
6.png
Persistent狀態(tài)轉(zhuǎn)換為Transient狀態(tài)
/**
* 測試一下delete方法骂远,看看執(zhí)行刪除操作后,對象狀態(tài)
*/
public void test4() {
Session session = null;
User user = null;
try {
session = hibernateUtil.getSession();
session.beginTransaction();
// 這里讀取出來一個persistent狀態(tài)的實體對象
user = (User) session.load(User.class, 1);
System.out.println("用戶名:" + user.getUserName());
// 這里刪除數(shù)據(jù)庫中的記錄
session.delete(user);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
hibernateUtil.closeSession(session);
}
System.out.println("用戶名稱:" + user.getId());
}
從庫里查出來腰根,然后刪除激才,事務提交,這個對象還是存在的额嘿,而且ID也是存在的瘸恼,雖然庫里面已經(jīng)沒有了
這里有幾點需要注意的問題:
- <property name="hibernate.hbm2ddl.auto">update</property>測試的時候需要來回的調(diào)整數(shù)據(jù)的覆蓋方式
- 。册养。钞脂。