Hibernate:如何禁用自动保存脏对象?

时间:2012-10-12 12:40:33

标签: hibernate transactions

我很惊讶地发现Hibernate会在事务结束时自动保存脏对象,而不会显式调用

dao.save(object)

我想到了this thread

描述的情况

我的问题是:有没有办法禁用此行为?乍一看,这种自动保存看起来相当危险,因为您需要知道哪些对象连接到会话,哪些不是,并且似乎很容易错误地保存。你能告诉我这种自动保存方法的好处是什么?我什么都看不到。 我想总是明确地调用dao.save(object)来更新任何东西。

我听说过一种可能的解决方法,即在sessionFactory上使用entityInterceptor。这个自定义entityInterceptor会覆盖findDirty方法,永远不会找到任何脏东西,但在这种情况下,我认为dao.save也不会起作用。有什么想法吗?

2 个答案:

答案 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()来实际写出与您的会话关联的所有脏实体。