考虑以下情况:
User user1 = userRepository.findOne(userId); //1
user.setName("xyz");
User user2 = userRepository.findOne(userId); //2
在状态#1上,user1包含数据库中存在的数据。但是在状态#2上,user2对象包含更新的用户对象(名称已更改)。
如何从状态#2
获取数据库中的原始数据答案 0 :(得分:0)
你要做的是违背JPA的要求。 JPA背后的核心思想之一是每个实体都由EntityManager
中的一个实例表示,如果你修改它,就不再有“旧”实例了,因为只有一个实例。如果你重新加载它,它将是相同的修改实例。
有各种方法可以避免这种情况。
从EntityManager
中退出实例,然后重新加载。正如您在评论中已经注意到的那样,现在不再管理修改后的实例,也不会自动保存,这可能不是您想要的。
选择Pojo中的信息,而不是实体。通常,您只需要很少的特定属性。如果您通过本机查询(@Query( ..., nativeQuery = true
)加载它们,这将直接进入数据库,当您修改的实体在此期间没有刷新时,它将看到旧数据,或者取决于事务隔离级别由另一个交易修改的版本。
您可以通过将每个属性复制到新实例来复制实体。