• 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(); } }
  • 相关阅读:
    poj 2186(强连通分量)
    zoj 3602
    STL string常用函数
    poj 2503 (map)
    poj 1161 walls
    poj 1164 dfs 位运算
    搭建Hadoop2.0(一)系统环境基本配置
    一步一个脚印——开启博客
    Javascript动态执行问题浅析
    input输入框的各种样式
  • 原文地址:https://www.cnblogs.com/linhong/p/4495336.html
Copyright © 2020-2023  润新知