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

时间:2012-08-31 22:42:51

标签: java hibernate jpa orm

是否可以阻止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将被认为处于持久状态的实体,然后我更新实体中的一些字段,然后将实体传递给验证。如果验证失败,则不要使用udpate,如果验证成功则继续实体。

以下是此流程的主要问题:因为我更新了实体以便在验证中使用它,无论我是否调用persist()方法(在DAO上),记录将始终是更新,因为hibernate检测到实体已被更改并标记它以进行更新。

请记住,我可以改变验证方式并解决问题,因此我对解决方法不感兴趣。我很想知道如何能够禁用hibernate功能,它会自动更新持久对象。

请记住我正在使用hibernates的JPA实现。所以处理hibernate特定API的Hibernate特定答案对我来说不起作用。

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

由于

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

TransactionInterceptor.currentTransactionStatus()使用setRollbackOnly();

就像魅力一样。

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以调用以下代码:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();