hibernate 动态更新注意事项
使用hibernate 动态更新能一定程度的优化我们的数据库,但是有时需在加载对象后对部分属性处理后传递给页面的时,在事务提交时会自动update 到数据库。下面就来分析动态更新何时生效:
Configuration cf = new Configuration().configure(); SessionFactory sf =cf.buildSessionFactory(); Session session = sf.openSession(); Transaction transaction = session.beginTransaction(); User u = (User) session.get(User.class, 1); System.out.println("name###"+u.getName()); // transaction.commit(); --- 1 // session.close(); --- 2 Thread.sleep(1000); // session = sf.openSession(); --- 3 // session.clear(); --- 4 session.evict(u); --- 5 transaction = session.beginTransaction(); --- 6 System.out.println("\n########################"); u.setName("upfna234e"); transaction.commit(); session.close();
user 表bo 开启dynamic-update="true" 的情况下分别注释上述代码中的五个位置。便可得结果:
1. 在 1、2、3、4、5、6 都关闭时,即同一个session,同一个事务提交,生成了update.
2. 在 2、3 、4、5 关闭时,即同一个session,不同的事务提交,生成update.
其他所有情况,如不同session, 调用session.clear() 或evict 方法都不会生成 update。
可以通过开关上面的几个选项一一验证。
另外,更新对象更特殊一点。不管 dynamic-update="true" 是否为true。只要在同一session 中都会产生update,并且不可以用evict(关联对象) 来清除。必须使用evict(u.bo) 的方式来清除,才不会产生update.