標籤:style blog http color 使用 strong
包括三種狀態:瞬態(自由態),持久態,託管態(游離態)
自由態
持久化對象的自由態,指的是對象在記憶體中存在,但是在資料庫中並沒有資料與其關聯。
持久態
持久態指的是持久化對象處於由Hibernate管理的狀態,這種狀態下持久化對象的變化將會被同步到資料庫中。
游離態
處於持久態的對象,在其對應的Session執行個體關閉後,此時對象進入游離態。也就是說Session執行個體是持久態對象的宿主環境,一旦宿主環境失效,那麼持久態對象迚入游離狀態。
session.beginTransaction(); User user = new User(); // 自由態user.setUserName("James"); user.setUserPwd("123"); System.out.println(user.getId()); //id不存在Integer id = (Integer) session.save(user); //返回對應資料庫中的iduser.setUserPwd("456"); session.getTransaction().commit(); // 持久態 → 游離態System.out.println(user.getId()); // id存在 Session session2 = HibernateUtil.getSessionFactory().getCurrentSsession2.beginTransaction(); user.setUserPwd("789"); session2.update(user); // 游離態 → 持久態session2.getTransaction().commit();
游離態和自由態區別
1. 區別就在於游離態對象可以再次與Session迚行關聯而成為持久態對
象。
2. 自由態對象在資料庫中沒有資料與其對應,但是游離態對象在資料庫
中有資料與其對應,只不過當前對象不在Session環境中而已。從對
象的是否有主索引值可以做簡單的判斷。
三種狀態的改變
load和get方法
• get和load方法都是利用對象的主索引值擷取相應的對象,並可以使對象處於持久狀態。
• load方法擷取對象時不會立即執行查詢操作,而是在第一次使用對象是再去執行查詢操作。如果查詢的對象在資料庫中不存在,load方法傳回值不會為null,在第一次使用時拋出org.hibernate.ObjectNotFoundException異常。
• 使用get方法擷取對象時會立即執行查詢操作,並且對象在資料庫中不存在時返回null值。
save和persist方法
• save和persist方法都是將持久化對象儲存到資料庫中
• sava方法成功執行後,返回持久化對象的ID
• persist方法成功執行後,不會返回持久化對象的ID,persist方法是JPA中推薦使用的方法
save和update方法
• save方法是將自由態的對象進行儲存。
• update方法是將游離態的對象進行儲存。
update和saveOrUpdate方法
• 如果一個對象是游離態或持久態,對其執行update方法後會將對象的修改同步到資料庫中,如果該對象是自由態,則執行update方法是沒有作用的。
• 在執行saveOrUpdate方法時該方法會自動判斷對象的狀態,如果為自由態則執行save操作,如果為游離態或持久態則執行update操作。
update和merge方法
• 如果持久化對象在資料庫中存在,使用merge操作時迚行同步操作。如果對象在資料庫不存在,merge對象則迚行儲存操作。
• 如果對象是游離狀態,經過update操作後,對象轉換為持久態。但是經過merge操作後,對象狀態依然是游離態。
saveOrUpdate和merge方法
saveOrUpdate方法和merge方法的區別在於如果session中存在兩個主索引值相同的對象,進行saveOrUpdate操作時會有異常拋出。這時必須使用merge迚行操作。
clear方法和flush方法
clear方法是將Session中對象全部清除,當前在Session中的對象由持久態轉換為游離態。flush方法則是將持久態對象的更改同步到資料庫中。(在事務提交之前進行flush操作)