hibernate的三种状态

1:临时状态 new
2: 持久化状态 save ,get,update
3: 脱管状态   clear close, evict

 在操作了hibernate的方法如save()等后,并没有直接生成sql语句,去操作数据库,而是把这些更新存入Session中,只有Session缓存要被更新时,底层的sql语句才能执行,数据存入数据库

public class StateTest extends hibernateUtil {

    /*
     *      Person p = new Person();
            p.setName("aaaa"); 
            ---->临时(瞬时)对象,只是在内存中,与hibernate无关
            
            session.save(p);
             tran.commit(); (托管对象)托给hibernate管理的对象
             --->持久化对象把p对象加入到hibernate中,并提交到了数据库(托管)
             
             session.close();
             ---->脱管对象(脱离hibernate管理的对象)
     */
    
    //session.save()把对象从临时状态变为持久化状态
    @Test
    public void savePerson()
    {
        Session session = factory.openSession();
        Transaction tran = session.beginTransaction();
        Person p = new Person();
        p.setName("aaaa");
        session.save(p);
//p.setName("bbbbb"); tran.commit(); session.close(); } 注意:在你执行Session.save(p)后,在Session清理缓存前,如果你修改user对象属性值,
那么最终存入数据库的值将是最后修改的值,相当于如下
Hibernate: insert into Person (name, id) values (?, ?)
Hibernate: update Person set name=? where id=?
//session.update()把对象从临时状态变为持久化状态 @Test public void updatePerson() { Session session = factory.openSession(); Transaction tran = session.beginTransaction(); Person p = new Person(); p.setId("abcdefg"); //临时状态 session.update(p); //只是将临时状态转变为持久化状态 tran.commit(); //commit的时候才insert语句 session.close(); } //session.get()把对象从临时状态变为持久化状态 //当get()得到一个对象的时候不需要再update()了,因为已经是持久化 //当一个对象三持久化对象的时候,hibernate内部会让该对象和快照对象对比 //如果一样不更新操作,不一样进行update操作 @Test public void getPerson() { Session session = factory.openSession(); Transaction tran = session.beginTransaction(); Person p=(Person) session.get(Person.class, "2"); //得到的person是持久化状态 p.setName("xx12"); //相当于已经更新了 (内部生成克隆的快照,对比属性变化) //session.update(p);//而update是将状态转变为持久化,所以可以不写 tran.commit(); session.close(); } //session.clear()把session中所有的对象清空( @Test public void testClear() { Session session = factory.openSession(); Transaction tran = session.beginTransaction(); Person p=(Person) session.get(Person.class, "2"); //得到的person是持久化状态 p.setName("好的哦"); session.clear();//把session中所有的对象清空(持久化--拖管),这样的话就不会执行update了 session.update(p);//拖管--持久化,就更新了 tran.commit(); session.close(); } //session.evict(p);把一个p对象转换为脱管状态 @Test public void testEvict() { Session session = factory.openSession(); Transaction tran = session.beginTransaction(); Person p=(Person) session.get(Person.class, "2"); //得到的person是持久化状态 p.setName("好的哦1"); session.evict(p); session.update(p);//拖管--持久化,就更新了 tran.commit(); session.close(); } //一个session是否是持久化是针对每一个session来说的 @Test public void testSession() { Session session = factory.openSession(); Transaction tran = session.beginTransaction(); Person p=(Person) session.get(Person.class, "2"); //得到的person是持久化状态 p.setName("session11111111"); tran.commit(); session.close(); session=factory.openSession(); tran=session.beginTransaction(); p.setName("session222222222");//p对象对于109行的session是临时状态,每个session是不一样的 //session.update(p);//又将session从临时状态转为持久态 tran.commit(); session.close(); } /* * 当tran.commit的一刹那执行的代码时候 * 1:如果一个对象为临时对象,session不管 * 2: 如果一个对象为持久化对象,如果有id,并和数据库的id对于。 * 那么先把该对象和快照对比如果一样就什么都不做,不一样就update * 3:如果一个对象为持久化对象,如果没有id,就会发生save()语句 */ @Test public void MutilyOption() { Session session = factory.openSession(); Transaction tran = session.beginTransaction(); Person p=new Person(); p.setName("mutiliy....."); Person pp=new Person(); pp.setName("mutiliyd....."); session.save(p); Person p1=(Person) session.get(Person.class,"2"); p1.setName("持久化了"); tran.commit(); session.close(); } }
原文地址:https://www.cnblogs.com/linhong/p/4495336.html