27

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

dao.save(object)

我想到了这个线程描述的情况

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

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

4

2 回答 2

14

我同意,你不应该手动冲洗。我的 webapp 开发者经验说 FlushMode 应该设置为“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("id already exists in database.", "RefPays.savePays.id.alreadyexist", "refPays.savePays.id.alreadyexist");
                }
            }
        } finally {
            sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
        }
    }
}
于 2014-03-07T10:13:55.597 回答
4

要禁用自动状态管理,请将会话上的刷新模式设置为手动。然后,您可以调用 session.flush() 来实际写出与您的会话关联的所有脏实体。

于 2012-10-13T20:34:53.157 回答