hibernate 动态更新注意事项 - 点滴记忆*记忆点滴
收藏本站

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.

    留下足迹