在Hibernate会话批量更新中调用Session.flush

时间:2011-04-08 12:13:59

标签: java hibernate session

我有一个对象列表,对于我正在执行Session.update()的每个对象,我什么时候应该调用Session.flush()?列表完成迭代后或每次更新后?代码段是:

public void updateUserAssignmentInfo(final long itemId) {
    getHibernateTemplate().execute(new HibernateCallback() {

        public Object doInHibernate(Session session) throws HibernateException, SQLException {
            session.flush();
            session.setCacheMode(CacheMode.IGNORE);
            List<UserAssignmentInfo> userAssignmentInfos = session.createQuery("from UserAssignmentInfo as userAssignmentInfo where userAssignmentInfo.itemId = " + itemId).list();
            if (userAssignmentInfos.size() == 0) {
                return null;
            }
            for (UserAssignmentInfo userAssignmentInfo : userAssignmentInfos) {
                userAssignmentInfo.setIsCurrentlyAssigned(false);
                session.update(userAssignmentInfo);
                // should I call flush here?
            }
            session.flush(); // or here?
            return null;
        }
    });
}

3 个答案:

答案 0 :(得分:3)

通常你根本不需要调用flush() - Hibernate会在执行查询之前和事务提交之前自动刷新会话。仅当您有某些理由覆盖默认行为时,才应使用手动flush()

此外,在这种情况下,您甚至不需要调用update() - 因为实体已在同一事务中加载,其状态的更改将自动传播到数据库。

答案 1 :(得分:1)

后者。

另请查看: http://docs.jboss.org/hibernate/core/3.5/reference/en/html/batch.html

最后调用会话刷新将导致查询仅被数据库软解析的概率更高。

答案 2 :(得分:0)

在批量操作中,将刷新模式设置为手动可能是有意义的。原因是如果你正在做我们说30k更新并且在每次更新之前有选择来验证某些条件,hibernate将在每次查询之前刷新会话,甚至读取。这将使性能降低。 我们已经看到了这种行为,并且通过将Flush模式转为手动,可以看到性能的提高