【问题标题】:Hibernate: how to disable automatic saving of dirty objects?Hibernate:如何禁用脏对象的自动保存?
【发布时间】:2012-10-03 06:47:43
【问题描述】:

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

dao.save(object)

我想到了this thread所描述的情况

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

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

【问题讨论】:

  • 这确实是hibernate最烦人的事情之一。考虑改用 ebean :)

标签: hibernate transactions


【解决方案1】:

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

【讨论】:

  • 嗯...我真的不想禁用 Hibernate 自动刷新 - 这会导致我失去 Hibernate 与性能相关的设施的好处。我只想让那些我明确调用 dao.save 或 dao.update 的对象变脏...
  • 你不能。恕我直言,这是 ORM 的主要优势之一:自动跟踪哪些对象是脏的并发出必要的 SQL
  • @StefanHaberl 这是主要优势之一吗?您多久编写一次代码而不是明确地对您真正想要保存的实体发出“保存”? Ofc 脏检查应该仍然存在,因此如果您发出保存并且实体不脏,则不会向数据库发出查询。
【解决方案2】:

我同意,您不应该手动冲洗。 我对 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);
        }
    }
}

【讨论】:

  • 如果只验证实体,为什么需要禁用脏检查?
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 2015-07-08
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2011-07-13
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多