我有一个对象列表,对于我正在执行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;
}
});
}
答案 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模式转为手动,可以看到性能的提高