Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行瞭非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。使用Hibernate可以使我們采用面向對象的思維操作關系型數據庫。此時,hibernate中對象有三種狀態。
對象的狀態主要取決於對象是否在session中。
1、在session外是什麼樣子的;
瞬時對象(Transient Objects):使用new操作符初始化的對象不是立刻就持久的。它們的狀態是瞬時的,也就是說它們沒有任何跟數據庫表相關聯的行為,隻要應用不再引用這些對象(不再被任何其他對象所引用),它們的狀態將會丟失,並有垃圾回收機制回收。
2、在session中是什麼樣子的;
持久化對象(Persist Objects):持久實例是任何具有數據庫標識的實例。它由持久化管理器session統一管理,持久實例是在事務中進行操作的——它們的狀態在事務結束時同數據庫進行同步。當事務提交時,通過執行SQL的Insert、Update和Delete語句把內存中的狀態同步到數據庫中。
3、從session中出來之後是什麼樣子的。
離線對象(Detached Objects):session關閉後,持久化對象變為離線對象。離線表示這個對象不能再與數據庫保持同步,它們不再接受Hibernate管理。
說明:
當創建一個狀態,即Transient。此狀態特點:數據庫中沒有,沒有被session管理。
可以這樣理解:session中有一個map,當save時,先放到map中,然後再放到數據庫中。
當對象被save後,則轉入Persist狀態,此時狀態是持久的,被保存到數據庫中。
當session執行close/evct/clear時,此時不被session管理,隻是存到瞭數據庫中。此時為Detached狀態。
通過代碼分析這三種狀態的轉換過程:
[html]
public class SessionTest extends TestCase {
public void testSave1()
{
Session session=null;
Transaction tx=null;
User user=null;
try{
session=HibernateUtils.getSession();
//開啟事務
tx=session.beginTransaction();
//Transient狀態
user=new User();
user.setName("zhangsan");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//Persistent狀態
//Persistent狀態的對象,當對象的屬性發生改變的時候,
//hibernate在清理緩存(臟數據檢查)的時候,會和數據庫同步
session.save(user);
user.setName("lisi");
//提交事務
tx.commit();
}catch(Exception e)
{
e.printStackTrace();
//回滾事務
tx.rollback();
}finally
{
//關閉session
HibernateUtils.closeSession(session);
}
//Detached狀態
user.setName("wangwu");
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//將Detached狀態的數據重新納入session管理
//此時將變為persistent狀態
//persistent狀態的對象在清理緩存時會和數據庫同步
session.update(user);
//提交事務,清理緩存,把內存中的事務放到緩存中去
session.getTransaction().commit();
}catch(Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
作者:missysm586