JPA:如何在事务中加载原始实体

时间:2012-12-29 16:13:11

标签: java hibernate jpa

我正在尝试在更新之前计算实体中的修改。

  1. 显示HTML表单
  2. 提交:
    1. 启动交易
    2. 加载实体
    3. 将表单数据应用于实体
    4. 计算更改
    5. 持久化实体
  3. 步骤2.1到2.3是通过我的MVC框架(Spring MVC)进行管理的,所以我实际上从未实际引用过没有更改的原始实体。

    所以我现在要做的是以下内容:

    // transaction is already started
    public Modifications store(Entity updated) {
        Entity original = entityManager.find(Entity.class, updated.getId());
        Modifications mods = calculateModifications(original, updated);
        entityManager.merge(updated);
        return mods;
    }
    

    但遗憾的是,我从实体经理收到的实体与更新的实体相同(阅读==)。

    以下是问题:如何强制实体管理器再次从数据库加载实体而不分离我更新的实体?

    我使用Hibernate作为我的持久性提供程序,但我希望尽可能地保持这个提供程序不可知。

2 个答案:

答案 0 :(得分:2)

以下是与您的问题Hibernate: comparing current & previous record

类似的答案

使用方法evict从会话缓存中删除旧实例,然后检查calculateModifications是否有从方法find获得的新更新

答案 1 :(得分:0)

顺便说一句,如果您使用detach,则可以使用EntityManager。如下代码:

entityManager.detach(newOne);
Order oldOne = orderRepository.findById(orderId);
// compare newOne and oldOne
...