【SSH】——Hibernate三种状态之间的转化
Hibernate的三種狀態為:transient、persistent和detached。對這三種狀態的理解可以結合Session緩存,在Session緩存中的狀態為persistent,另外兩種不在Session中。
另一種說法是,Hibernate有四種狀態,增加一個removed狀態。在一個session實例的緩存中刪除時會轉化到該狀態。
transient
通過new()創建,不在session的緩存中,也與數據庫無關的狀態。處在該狀態的對象稱為臨時對象。
persistent
對象在session緩存區中,數據庫中有數據與之對應。
detached
俗稱游離狀態,即存在于數據庫中,但session中已經不存在該對象。
上圖是其三種狀態之間的轉化,下面我們通過實例來具體看一下。
1、開始——>transient
private static SessionFactory factory;/*** 完成sessionFactory的初始化*/static{try{//讀取hibernate.cfg.xml配置文件Configuration cfg=new Configuration().configure();//建立sessionFactory,可訪問mysqlfactory=cfg.buildSessionFactory();}catch(Exception e){e.printStackTrace();}finally{}}//獲得sessionpublic static Session getSession(){return factory.openSession();}獲取session對象
//獲取session對象session = HibernateUtil.getSession();// 開啟ts = session.beginTransaction();// Transient狀態user = new User();user.setName("張三");user.setPassword("1233");user.setCreateTime(new Date());user.setExpireTime(new Date());執行new()方法之后,對象進入transient狀態。對照上圖也可以看出,如果接下來不對其進行操作,該對象最終會被垃圾回收,不再是transient狀態。
那么接下來,我們對其執行簡單的save()操作。
2、transient——>persistent
// 執行過后,被session管理 Persistentsession.save(user);//修改用戶姓名user.setName("張四");//commit會把數據與數據庫進行同步。 ts.commit();3、persistent——>detached
關閉session,對象狀態由持久化轉為游離態。
if(session!=null){if(session.isOpen()){session.close();}}4、detached——>persistent
這里,我們通過update()方法實現。
//再次修改用戶名user.setName("張五");//獲取session對象,與上面類似 session = HibernateUtil.getSession();// 開啟ts = session.beginTransaction();// 將session管理// 變為persistent狀態,清理緩存時同步數據庫。session.update(user);session.getTransaction().commit();了解Hibernate中對象的三種狀態,可以幫助我們對其進行靈活的操作。也可以幫助我們理解他與session緩存、數據庫之間的關聯。
轉載于:https://www.cnblogs.com/saixing/p/6730246.html
總結
以上是生活随笔為你收集整理的【SSH】——Hibernate三种状态之间的转化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swift - 30 - 可变参数
- 下一篇: ASP.net之策略模式