Hibernate-----对象三种状态

       瞬时态(临时态):transient,session没有缓存对象,数据库也没有对应记录。

                                    1.没有与Hibernate产生关联.  2.与数据库中的记录没有产生关联(有关联就是与数据库中的id有对应).

                                    OID特点:没有值

       持久态:persistent,session缓存对象,数据库最终会有记录。(事务没有提交)

                                   OID特点:有值

       游离态(托管态):detached,session没有缓存对象,数据库有记录。

.                                 1.没有与Hibernate产生关联               2.对象有ID

                                 OID特点:有值

 



package com.itheima.a_state;

import org.hibernate.Session;
import org.junit.Test;

import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//对象的三种状态
public class Demo1 {
    @Test
    //演示三种状态
    public void fun1(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u = new User();    // 瞬时状态
        u.setName("tom");        // 瞬时状态
        u.setPassword("1234");    // 瞬时状态
        
        session.save(u);        // 持久状态
                                    //问题: 调用完save方法,数据库中有没有对应记录?
                                    // 没有对应记录, 但是最终会被同步到数据库中.仍然是持久状态.
        //------------------------------------------------
        session.getTransaction().commit(); // 持久状态
        session.close(); // 游离状态
    }
    
    @Test
    //三种状态的转换
    // 瞬时 => 持久
    public void fun2(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u = new User();    // 瞬时状态
        u.setName("tom");        // 瞬时状态
        u.setPassword("1234");    // 瞬时状态
        
        session.save(u);        // 持久状态   save方法会使用主键生成策略,为User指定id. => 
                                                                    //主键自增 => 打印 insert语句
                                                                    // increment=> select max(id) ....
                                                                    //assigned => 需要手动指定主键,不指定将会报错

//------------------------------------------------  
        session.getTransaction().commit(); // 持久状态
                                    //事务提交时,会把持久化状态对象同步到数据库中
        session.close(); // 游离状态
    }
    
    // 瞬时=> 游离
    // 瞬时: 没有关联,没有id
    // 游离: 没有关联,有id(与数据库中对应的id)
    @Test
    public void fun3(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u = new User();    // 瞬时状态
        
        u.setId(1);    //游离
        
        //----------------------------------------------------
        session.getTransaction().commit(); // 持久状态
                                    //事务提交时,会把持久化状态对象同步到数据库中
        session.close(); // 游离状态
    }


    @Test
    // 持久=> 瞬时
    // 持久: 有关联,有id
    // 瞬时: 无关联,无id
    public void fun4(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通过get方法,得到持久状态对象
        User u= (User) session.get(User.class, 1); // 持久状态
        
        //----------------------------------------------------
        session.getTransaction().commit(); // 持久状态
                                    //事务提交时,会把持久化状态对象同步到数据库中
        session.close(); // 游离状态
        u.setId(null);//瞬时状态
    }
    @Test
    // 持久=> 瞬时
    // 持久: 有关联,有id
    // 瞬时: 无关联,无id
    public void fun5(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通过get方法,得到持久状态对象
        User u= (User) session.get(User.class, 1); // 持久状态
        session.evict(u);//将User对象与session的关联移除
        u.setId(null);//瞬时状态
        
session.save(u);//持久状态
        //----------------------------------------------------
        session.getTransaction().commit(); // 持久状态
                                    //事务提交时,会把持久化状态对象同步到数据库中
        session.close(); // 游离状态
    }


        // 持久=> 游离
    @Test
    // 持久=> 游离
    // 只需要将session的关联取消
    public void fun6(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通过get方法,得到持久状态对象
        User u= (User) session.get(User.class, 1); // 持久状态
        
        session.evict(u);//游离
        //----------------------------------------------------
        session.getTransaction().commit(); // 游离状态
        session.close(); // 游离状态
    }
        
    @Test
    // 游离=> 瞬时
    // 移除ID 
    public void fun7(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通过get方法,得到持久状态对象
        User u= (User) session.get(User.class, 1); // 持久状态
        session.evict(u);//游离
        u.setId(null);// 瞬时
        //----------------------------------------------------
        session.getTransaction().commit(); // 瞬时状态
        session.close(); // 瞬时状态
    }


    @Test
        // 游离=> 持久
        // 是否与Session关联
    public void fun8(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通过get方法,得到持久状态对象
        User u= (User) session.get(User.class, 1); // 持久状态     
        session.evict(u);//游离
        session.update(u);//持久
        //----------------------------------------------------
        session.getTransaction().commit(); // 持久状态 -> 打印update语句
        session.close(); // 瞬时状态
    }



 //三种状态有什么用?
    // 持久状态,我们使用Hibernate主要是为了持久化我们的数据.
    // 对于对象的状态,我们期望我们需要同步到数据库的数据,都被装换成持久状态
    //持久化状态特点: Hibernate会自动将持久化状态对象的变化同步到数据库中.


    @Test
    // 游离=> 持久
    // 是否与Session关联
public void fun9(){
    Session session = HibernateUtils.openSession();
    session.beginTransaction();
    //------------------------------------------------
        //通过get方法,得到持久状态对象
    User u= (User) session.get(User.class, 1); // 持久状态 
    //u.setName("jerry");//        为持久状态
    u.setId(3);//与session建立关联的对象的ID,不允许修改. -------------  报错
    
    session.update(u);// 多余=> 因为Hibernate会自动将持久化状态对象的变化同步到数据库中.
    //----------------------------------------------------
    session.getTransaction().commit(); // 持久状态 -> 打印update语句
    session.close(); // 瞬时状态
}
    
    
}

猜你喜欢

转载自blog.csdn.net/yindusu/article/details/83142306