读书人

session清算策略和session提交策略

发布时间: 2012-07-24 17:47:58 作者: rapoo

session清理策略和session提交策略
当缓存中的实体发生改变,并不会立即执行相关的sql语句。这使得session能够把几条sql语句合并成一条sql语句。如:
tx = session.beginTransaction();
Customer customer = (Customer)session.load(Customer.class,new Long(1));

customer.setName("李义星");
customer.setAge(22);

tx.commit();

当提交事务的时候,清理缓存,并组合成了一条sql语句。

默认情况下,session通过已经顺序执行:
1.按照应用程序调用save方法的先后顺序,执行对实体进行的插入语句。
2.执行所有对实体进行的更新语句。
3.执行对集合进行的delete语句。
4.执行对集合元素进行的delete语句。
5.执行对集合进行插入的inster语句。
6.按照应用程序调用delete方法的先后顺序执行对实体进行删除的delete语句。

默认情况下,session会在
1.事务提交的时候,先清理缓存,再提交事务。
2.调用find或者iterate方法时,如果缓存中的持久化对象属性发生变化,就会先清理缓存。
3.当调用flush方法

另外如果对象使用的是native生成器策略生成OID,那么当调用session的save保存对象时,会立即执行插入语句。其他策略的时候,session的save方法不会立即执行sql语句,只有在session清理缓存的时候才会执行sql语句。如果save执行再次修改这个实体的属性,会照成对这个实体执行一次update,因此不建议save之后再修改,而是修改好执行再save。

session对一个已经持久化的对象执行两次save,第二次是多余的。如
Customer c = new Customer();
session.save(c);
customer.setName("tom");
session.save(c);//多余的,因为无需这么做,session会自动完成更新。


一个新的session对一个游离状态的对象执行save,会照成两条相同数据
Customer c = new Customer();
customer.setName("tom");
session.save(c);
session.close();

session2.save(customer);//此时多了一条相同数据,只是id不同。

update方法
Cu c =new Cu();
//设置c属性略
session1.save(c);
session1.close();//c处于游离状态

c.setName("name2");
session2.update(c);
customer.setName("name3");
session2.close();
实际上做的事是
1.调用session2的update方法,只是把c加入到缓存,并不执行sql。
2.session2.close()才会生成最后的sql语句,并完成更新。

读书人网 >开源软件

热点推荐