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
,它位于一级缓存中并被修改。
@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
,它位于一级缓存中并被修改。