<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-21  評論-29  文章-0  trackbacks-0
    實體對象的三種狀態
        瞬時(transient):數據庫中沒有數據與之對應,超過作用域會被JVM垃圾回收器回收,一般是new出來且與session沒有關聯的對象;
        持久(persistent):數據庫中有數據與之對應,當前與session有關聯,并且相關聯的session沒有關閉,事務沒有提交;持久對象狀態發生改變,在事務提交時會影響到
                                          數據庫(Hibernate能檢測到);
        脫管(detached):數據庫中有數據與之對應,但當前沒有session與之關聯;托管對象狀態發生改變,Hibernate不能檢測到。


    如上圖所示,當我們new處一個user時,這個對象是瞬時的;(與數據庫、session均無關系)
    當我們用save方法使user對象保存到session時,這時對象是持久的;
    當user對象發生變化,如執行commit語句,user對象的變化都會反映在數據庫中。(數據庫中有數據對應,在session管理之中)
    當調用close語句后,user對象從session中出來,此時對象是脫管的。(數據庫中有數據對應,但與session沒關系了)

    以下實例說明以上三種實體對象狀態
    package cn.itcast.hibernate;
    import java.util.Date;

    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import cn.itcast.hibernate.domain.User;
    import org.hibernate.Transaction;
    public class Base {

        
    public static void main(String[] args) {
            
            User user 
    = new User();
            user.setBirthday(
    new Date());
            user.setName(
    "name");
            
    //111  以上的user對象為瞬時對象
            addUser(user);    
            System.out.println(
    "id:"+user.getId());
            
    //222  與111之間的user對象為脫管對象
            
        }

        
         
    static User getUser(int id){
             Session s 
    = null ;
             
    try{
                 s 
    = HibernateUtil.getSession();
                 Class userClass 
    = User.class;
                 
    //User user = (User)s.get(User.class,id);
                 User user1 = (User)s.load(User.class,id);
                 System.out.println(
    "name:"+user1.getName());
                 
                 
    return user1 ;
             }
    finally {
                 
    if(s !=null)
                     s.close();
             }

         }

        
            
    static void addUser(User user){
                Session s 
    = null ;
                Transaction tx 
    = null ;
                
    try{
                    s 
    = HibernateUtil.getSession();
                    tx 
    = s.beginTransaction();
                    s.save(user);
                    
    //333  
                    user.setName("new name");
                    tx.commit();
                    
    //444  與333之間的對象為持久對象
                }
    catch(HibernateException e){
                    
    if(tx !=null)
                        tx.rollback();
                    
    throw e ;
                }
    finally {
                    
    if(s !=null)
                        s.close();
                }

            }

            
    }

    執行該程序 觀察控制臺輸出

    再查看數據庫中user表內容

    發現持久對象的狀態改變Hibernate能知道,會在數據庫中得到反映。

    脫管對象的狀態如果想將其狀態反映到數據庫中,可以調用session的update方法。


    當我們不知道對象是瞬時的還是脫管的,可以調用session的saveOrUpdate方法,由Hibernate自己(根據對象的id是否有值)判定處理。
    調用saveOrUpdate保存對象,對象將變成持久的,而調用merge方法對象還是脫管的。

    對象調用setName等方法,數據庫并不會立即更新,而是到執行commit語句后才更新。盡量延遲和數據庫的交互。

    補充:三種對象轉換關系圖

     

    posted on 2009-05-04 14:20 特立獨行 閱讀(281) 評論(0)  編輯  收藏 所屬分類: Hibernate框架
    主站蜘蛛池模板: 波多野结衣在线免费视频| 又粗又黄又猛又爽大片免费| 无码国产精品久久一区免费| 亚洲国产精久久久久久久| 精品一卡2卡三卡4卡免费视频| 亚洲国产三级在线观看| 亚洲免费在线播放| 亚洲美女免费视频| 57PAO成人国产永久免费视频| 亚洲AV无码精品蜜桃| 免费国产黄线在线观看 | 国产亚洲综合成人91精品| 精品人妻系列无码人妻免费视频| 毛茸茸bbw亚洲人| 国内精品久久久久影院免费| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲AV无码久久久久网站蜜桃| 91热成人精品国产免费| 狠狠色伊人亚洲综合网站色| 情侣视频精品免费的国产| 四虎影视在线看免费观看| 久久久久久久久免费看无码| 亚洲人成未满十八禁网站| 免费大香伊蕉在人线国产| 精品一区二区三区免费视频| 91在线亚洲精品专区| 女人18毛片水真多免费看| 深夜免费在线视频| 亚洲成人激情在线| 免费观看的av毛片的网站| 国产成人1024精品免费| 久久亚洲日韩看片无码| 永久免费bbbbbb视频| 97在线免费视频| 色在线亚洲视频www| 99在线精品视频观看免费| 精品亚洲成a人在线观看| 亚洲VA中文字幕不卡无码| 成人免费看黄20分钟| 中文在线日本免费永久18近| 亚洲精品日韩专区silk|