<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框架
    主站蜘蛛池模板: 亚洲AV性色在线观看| 久久精品国产亚洲AV电影| 亚洲综合激情五月色一区| 91青青国产在线观看免费| 亚洲AV综合色区无码一区爱AV| 人禽伦免费交视频播放| 免费99热在线观看| 亚洲av午夜电影在线观看| 国产精品视_精品国产免费| 亚洲s码欧洲m码吹潮| 国产一区二区三区免费看| 国产成人亚洲综合无| 亚洲午夜AV无码专区在线播放| 日本特黄特色AAA大片免费| 亚洲黄片毛片在线观看| 美女无遮挡拍拍拍免费视频| 亚洲人成色77777| 99精品一区二区免费视频| 亚洲精品电影在线| 免费A级毛片无码免费视| 亚洲国产区男人本色| 亚洲成a人片在线观看国产| 亚洲免费一区二区| 亚洲丁香色婷婷综合欲色啪| 波多野结衣在线免费观看| 亚洲精品乱码久久久久久蜜桃图片| 亚洲AV无码乱码精品国产| a级毛片免费全部播放无码| 久久亚洲AV无码精品色午夜| 女人张开腿给人桶免费视频| 青娱乐在线视频免费观看| 亚洲成A人片777777| 18国产精品白浆在线观看免费| 香蕉视频在线观看免费| 亚洲av永久无码精品网站| 久久不见久久见免费影院 | 亚洲男人的天堂一区二区| 你懂的在线免费观看| 亚洲小说区图片区| 亚洲国产成人久久综合碰| 99免费在线观看视频|