【问题标题】:How to disable auto update in hibernate/JPA如何在休眠/JPA 中禁用自动更新
【发布时间】:2012-08-26 17:48:29
【问题描述】:

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

    @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 的休眠特定答案对我不起作用。

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

谢谢

——编辑—— 我找不到解决方案,所以我选择回滚事务而不抛出任何 RuntimeException,即使我在声明性事务中使用:

TransactionInterceptor.currentTransactionStatus().setRollbackOnly();

这就像一个魅力。

【问题讨论】:

    标签: java hibernate jpa orm


    【解决方案1】:

    【讨论】:

    • 这是 Hibernate 特定的 API,主要涉及休眠在执行查询之前的行为(刷新与否,以避免陈旧数据)。 JPA EntityManager 允许设置刷新模式,但它也只与查询管理有关。即使我仍然尝试将 EntityManager 中的刷新模式设置为不同的类型,但它仍然没有任何区别。
    • @user 你的评论我不清楚。在我上面粘贴的链接中明确设置了“表示刷新策略。刷新过程通过检测状态变化并执行SQL语句来同步数据库状态和会话状态。”见link
    • 首先:这是 Hibernate 特定的 API,而不是 JPA API。第二:JPA 刷新模式设置不会影响行为,因为 JPA 有 2 种刷新模式类型 commit 和 auto 并且没有手动模式。所以回到我的问题如何在 JPA 中禁用自动更新,因为您提供的链接在 JPA 上下文中没有多大帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      可以调用如下代码:

      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 谢谢,但正如我所说,我不是在寻找解决方法,我已经有了,我正在寻找可以禁用自动更新的特定配置。
        猜你喜欢
        • 1970-01-01
        • 2010-11-06
        • 2018-05-10
        • 2010-11-16
        • 2011-02-09
        • 1970-01-01
        • 2021-10-02
        • 2015-01-27
        • 2019-01-10
        相关资源
        最近更新 更多