我不喜欢把一些理论当理论来记,那样感觉好无趣,生活应当充满乐趣,学习也应如此。
首先我将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();
}