<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框架
    主站蜘蛛池模板: 丰满人妻一区二区三区免费视频 | 国产精品亚洲专区无码WEB| a毛片免费观看完整| 成年女人看片免费视频播放器| 亚洲VA中文字幕无码毛片| 亚洲aⅴ无码专区在线观看| 无码免费一区二区三区免费播放| 国产日产成人免费视频在线观看| 亚洲视频在线观看免费视频| 久久嫩草影院免费看夜色| 国产精品免费视频一区| 亚洲伊人久久大香线蕉| 国产真人无码作爱视频免费| 日韩电影免费在线观看视频 | 成人免费乱码大片A毛片| 在线精品免费视频| 亚洲人成影院77777| 久久青草精品38国产免费| 亚洲综合无码精品一区二区三区 | 亚洲国产一区视频| 亚洲国产区男人本色| 日韩欧美一区二区三区免费观看 | 久久aa毛片免费播放嗯啊| 亚洲黄黄黄网站在线观看| 亚洲αⅴ无码乱码在线观看性色| 国产成人精品免费视频动漫 | 亚洲国产亚洲综合在线尤物| 97人妻精品全国免费视频| 亚洲天堂在线视频| 国产亚洲视频在线观看| 青青青青青青久久久免费观看| 亚洲AV无码专区在线亚| 91嫩草免费国产永久入口| 亚洲天堂男人天堂| 久久免费美女视频| 亚洲成av人在线视| 一个人看的www免费视频在线观看 一个人免费视频观看在线www | 麻豆国产VA免费精品高清在线| 亚洲中文字幕无码一去台湾 | 337p欧洲亚洲大胆艺术| 久久这里只精品热免费99|