如何在Hibernate/JPA中禁用自动更新

13

如何阻止 Hibernate 自动更新持久化对象?

    @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);
        }
    }

在这段代码中,我检索了一个被Hibernate视为持久状态的实体,然后更新实体中的一些字段,并将该实体传递给验证。如果验证失败,则不更新,如果验证成功,则持久化实体。

这个流程的主要问题是:因为我更新了实体以供验证使用,所以无论是否调用persist()方法(在DAO上),记录都将始终被更新,因为Hibernate检测到实体已更改并标记它需要更新。

请注意,我可以改变验证方式来解决此问题,因此不想尝试其他解决方法。我想知道如何禁用Hibernate自动更新持久化对象的功能。

请注意,我正在使用Hibernate JPA的实现。因此,处理Hibernate特定API的Hibernate特定答案对我没有作用。

我尝试查找Hibernate配置并查看是否可以设置任何配置来停止此行为,但没有成功。

谢谢

-- 编辑 ---
我找不到解决方法,所以我选择回滚事务而不抛出任何RuntimeException,即使我处于声明性事务中,使用:
TransactionInterceptor.currentTransactionStatus().setRollbackOnly();
这个方法非常有效。

4个回答

5

1
这是特定于Hibernate的API,主要涉及Hibernate在执行查询之前的操作(刷新或不刷新,以避免过期数据)。JPA EntityManager允许设置刷新模式,但它也仅涉及查询管理。即使我尝试将EntityManager中的刷新模式设置为不同类型,但仍然没有任何区别。 - lutfijd
@user,您的评论对我来说不是很清楚。在我上面粘贴的链接中,明确设置了“表示刷新策略。通过检测状态更改并执行SQL语句,刷新过程将数据库状态与会话状态同步。”请参见[链接](https://dev59.com/cHA75IYBdhLWcg3wkaCA)。 - Łukasz Rzeszotarski
第一:这是Hibernate特定的API,而不是JPA API。 第二:JPA刷新模式设置不会影响行为,因为JPA有两种刷新模式类型commit和auto,并且没有手动模式。 所以回到我的问题,如何在JPA中禁用自动更新,因为您提供的链接在JPA上下文中帮助不大。 - lutfijd

2
您可以调用以下代码:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

1

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

谢谢,但正如我所说,我不是在寻找解决方法,我已经有了,我正在寻找一个特定的配置来禁用自动更新。 - lutfijd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接