我很惊讶地发现Hibernate会在事务结束时自动保存脏对象,而不会显式调用
dao.save(object)
我想到了this thread
描述的情况我的问题是:有没有办法禁用此行为?乍一看,这种自动保存看起来相当危险,因为您需要知道哪些对象连接到会话,哪些不是,并且似乎很容易错误地保存。你能告诉我这种自动保存方法的好处是什么?我什么都看不到。 我想总是明确地调用dao.save(object)来更新任何东西。
我听说过一种可能的解决方法,即在sessionFactory上使用entityInterceptor。这个自定义entityInterceptor会覆盖findDirty方法,永远不会找到任何脏东西,但在这种情况下,我认为dao.save也不会起作用。有什么想法吗?
答案 0 :(得分:12)
我同意,你不应该手动冲洗。 我对webapp开发人员的经验说FushMode应该设置为“AUTO”。 但有时我需要禁用脏检查(用于验证数据,验证数据库中的数据以及通过表单或服务返回数据)。 为此,我通过更改FLUSHMODE
创建一个特殊类并禁用脏检查@Component
public class ValidateRefPaysService implements IValidateRefPaysService {
...
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
@Override
@Transactional(readOnly=true)
public void validate(RefPays refPays) throws BusinessException {
try {
sessionFactory.getCurrentSession().setFlushMode(FlushMode.MANUAL);
if ( refPays.getId() != null ) {
RefPays refPaysBase = refPaysDAO.getById(refPays.getId());
if ( refPaysBase != null ) {
throw new BusinessException("L'id already exists in database.", "RefPays.savePays.id.alreadyexist", "refPays.savePays.id.alreadyexist");
}
}
} finally {
sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
}
}
}
答案 1 :(得分:4)
要禁用自动状态管理,请将会话的刷新模式设置为MANUAL。然后,您可以调用session.flush()来实际写出与您的会话关联的所有脏实体。