JPA 实体是否存储对实体管理器的引用?

Does JPA Entity store reference to Entity Manager?

@Entity
class Employee{
@Id
String name;
int age;
String gender;
}

我在 Hashmap 中使用上面的实体对象作为键:

Employee e1 = new Employee("abc",23,"M")

现在,如果我创建一个具有相同 ID 的新实体并保留它:

@Autowired
EmployeeDao employeeDao;

e1.findByName("abc");

Map<Employee, Boolean> map = new HashMap<>();
map.put(e1, true);

Employee e2 = new Employee("abc",45,"F");
employeeDao.save(e2)

for(Employee ex:map.keySet()){
     map.get(ex);   //Returns null
}

我发现我的 HashKey(e1) 也被改变了(到 e2)。现在,由于 Hashmap 使用 "Entry" 个对象,其中 Key 将是一个 Employee 实体对象(已更改),JPA 实体是否引用存储在实体管理器中的对象?这就是密钥更改的原因吗?

为什么 Key(e1) 自动改变了?

Spring Data JPAs save 在幕后进行合并。 merge 在一级缓存中查找具有相同 class 和 id 的实体。 如果找到一个,它会将状态从参数复制到缓存中的实例。 脏检查然后确保它被刷新到数据库。 merge 进而 save 也 return 在一级缓存中找到的实体。

由于您在同一个事务中从数据库加载 e1,它位于一级缓存中并被修改。