• hibernate中的session几种状态


      我不喜欢把一些理论当理论来记,那样感觉好无趣,生活应当充满乐趣,学习也应如此。

      首先我将session想成是一个大的容器,这个当然是随便我们怎么想了。而对于session中的几种状态,我喜欢这样来区分,在session中和在session外。刚new出来的对象在session外,经过查询和保存(好多方法了)的对象在session中,经过驱赶方法后的对象在session外。我觉得这样对于我理解执行这些方法时sql语句的产生有很大的帮助。

      下面用几个代码片段来分析一下上面说的。主键的生成策略( <generator class="identity" />)

    //Hibernate: insert into test.person_ (pname, psex) values (?, ?)
    public void save(){ Session session = factory.openSession(); session.getTransaction().begin();
            //在session外 Person person = new Person(); person.setPname("大崔"); person.setPsex("男");    //经过save方法到session中 session.save(person);    //事物提交时刷新到数据库 session.getTransaction().commit(); session.close(); }
    //Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.psex as psex0_0_ from test.person_ person0_ where person0_.pid=?	
    public void save3(){ Session session = factory.openSession(); session.getTransaction().begin();
            //经过查询方法后在session中,且数据库中person的sex属性是“男” Person person = (Person) session.get(Person.class, 5L);
            //在session中修改后还是在session中,且并没有真正的修改sex属性 person.setPsex("男");
            //因此此时的update不会执行 session.update(person); session.getTransaction().commit(); session.close(); }
    //Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.psex as psex0_0_ from test.person_ person0_ where person0_.pid=?
    //Hibernate: update test.person_ set pname=?, psex=? where pid=?
    public void save6(){ Session session = factory.openSession(); session.getTransaction().begin();
        //经过查询方法后在session中,且数据库中person的sex属性是“男” Person person = (Person) session.get(Person.class, 5L);
        //在session中修改后还是在session中,且此时真正的修改sex属性(相对于session中的person) person.setPsex("女");
        //所以此时会执行update方法 session.update(person); session.getTransaction().commit(); session.close(); }
    	public void update3(){ 
    		Session session = factory.openSession();
    		session.getTransaction().begin();
    		Person person = new Person();
    		person.setPid(1L);
    		//此时session中并没有person,因此对于每一个需要跟新的person,session都会认为是新的,因此会每次都执行update方法
    		session.update(person);
    		
    		session.getTransaction().commit();
    		session.close();
    	}
    
  • 相关阅读:
    @Transactional 什么情况下会失效?
    如何主持一场专业的面试?
    MIT-HIB 心率数据库及相关
    hadoop中Writable类
    XXX.jar has no source attachment
    Win10Eclipse配置个人本地hadoop
    js去除两个数组中重复的元素
    JS找出两个数组中不相同的元素
    flex中order控制元素的排列顺序
    flex中align-self设置侧轴的某元素的对其方式
  • 原文地址:https://www.cnblogs.com/Jc-zhu/p/4527155.html
Copyright © 2020-2023  润新知