12

是否可以阻止休眠自动更新持久对象?

    @Transactional
    public ResultTO updateRecord(RequestTO requestTO) {

        Entity entity = dao.getEntityById(requestTO.getId());

         // now update the entity based on the data in the requestTO

         ValidationResult validationResult = runValidation(entity);

         if(validationResult.hasErrors()) {
            // return ResultTO with validation errors
         } else {
             dao.persist(entity);
        }
    }

下面是代码中发生的情况,我检索了被休眠认为处于持久状态的实体,然后我更新了实体中的一些字段,然后将实体传递给验证。如果验证失败,则不要更新,如果验证成功,则保留实体。

这是此流程的主要问题:因为我更新了要在验证中使用的实体,所以无论我是否调用 persist() 方法(在 DAO 上)都没有关系,记录将始终更新,因为休眠检测到实体已更改并将其标记为更新。

请记住,我可以改变我进行验证和解决问题的方式,所以我对解决方法不感兴趣。我很想知道如何禁用休眠功能,它会自动更新持久对象。

请记住,我使用的是休眠的 JPA 实现。所以处理休眠特定API的休眠特定答案对我不起作用。

我试图寻找休眠配置,看看我是否可以设置任何配置来阻止这种行为,但没有运气。

谢谢

--EDIT --- 我找不到解决方案,所以我选择回滚事务而不抛出任何 RuntimeException,即使我处于声明性事务中,使用:

TransactionInterceptor.currentTransactionStatus().setRollbackOnly();

这就像一个魅力。

4

4 回答 4

4

为您的会话配置 FlushMode。

http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html

于 2012-09-01T22:24:35.570 回答
1

您可以调用以下代码:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
于 2015-04-16T07:27:19.193 回答
1

从数据库中获取对象后,您可以使用 EntityManager.clear() 方法。 http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#clear()

于 2013-08-12T12:03:37.513 回答
0

如果验证失败,则抛出异常并让调用者处理。

于 2012-08-31T22:54:12.850 回答