JPA如何在本地修改之后但在提交之前从数据库获取数据

时间:2018-02-08 09:15:43

标签: mysql jpa spring-data-jpa

考虑以下情况:

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

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

如何从状态#2

获取数据库中的原始数据

1 个答案:

答案 0 :(得分:0)

你要做的是违背JPA的要求。 JPA背后的核心思想之一是每个实体都由EntityManager中的一个实例表示,如果你修改它,就不再有“旧”实例了,因为只有一个实例。如果你重新加载它,它将是相同的修改实例。

有各种方法可以避免这种情况。

  1. EntityManager中退出实例,然后重新加载。正如您在评论中已经注意到的那样,现在不再管理​​修改后的实例,也不会自动保存,这可能不是您想要的。

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

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