1

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

  1. 显示 HTML 表单
  2. 提交时:
    1. 开始交易
    2. 加载实体
    3. 将表单数据应用于实体
    4. 计算变化
    5. 持久化实体

步骤 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 作为我的持久性提供程序,但我想尽可能地保持这个提供程序不可知论。

4

2 回答 2

2

这是一个类似于您的问题Hibernate: comparison current & previous record的 SO 答案

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

于 2012-12-29T16:30:58.303 回答
0

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

entityManager.detach(newOne);
Order oldOne = orderRepository.findById(orderId);
// compare newOne and oldOne
...
于 2018-11-10T02:16:27.057 回答