随笔-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 特立独行 阅读(280) 评论(0)  编辑  收藏 所属分类: Hibernate框架

只有注册用户登录后才能发表评论。


网站导航: