【问题标题】:JPA How to get data from database after local modification but before commitJPA如何在本地修改后但在提交之前从数据库中获取数据
【发布时间】:2018-02-09 14:56:25
【问题描述】:

考虑以下场景:

User user1 = userRepository.findOne(userId); //1
user.setName("xyz");
User user2 = userRepository.findOne(userId); //2

在状态 #1 user1 包含存在于数据库中的数据。但在状态 #2 user2 对象包含更新的用户对象(名称已更改)。

如何从状态 #2 的数据库中获取原始数据

【问题讨论】:

标签: mysql jpa spring-data-jpa


【解决方案1】:

您正在尝试做的是违反 JPA 的规定。 JPA 背后的核心思想之一是每个实体都由EntityManager 中的一个实例表示,如果您修改它,则不再有“旧”实例,因为只有一个。如果你重新加载它,它将是同一个修改后的实例。

有多种方法可以规避这一点。

  1. EntityManager 中逐出实例,然后重新加载。正如您在 cmets 中已经注意到的,修改后的实例现在不再受管理并且不会自动保存,这可能不是您想要的。

  2. 选择信息到 Pojo,而不是实体。通常您只需要很少的特定属性。如果您通过本机查询 (@Query( ..., nativeQuery = true) 加载它们,这将直接进入数据库,并且当您修改的实体同时没有被刷新时,它将看到旧数据,或者取决于事务隔离级别的版本被另一个事务修改。

  3. 您可以通过将每个属性复制到新实例中来复制实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2010-12-19
    • 2015-02-05
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多