Хранит ли JPA Entity ссылку на Entity Manager? - PullRequest
1 голос
/ 25 марта 2019
@Entity
class Employee{
@Id
String name;
int age;
String gender;
}

Я использую указанный выше объект сущности в качестве ключа в Hashmap:

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

Теперь, если я создам новую сущность с тем же идентификатором и сохраню ее:

@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 будет объектом Entity Entity (который изменился), действительно ли объекты JPA ссылаются на объекты, хранящиеся в Entity Manager?Вот почему ключ изменился?

Почему ключ (e1) изменился автоматически?

1 Ответ

1 голос
/ 26 марта 2019

Spring Data JPAs save выполняет слияние под капотом.merge ищет сущность с тем же классом и идентификатором в кэше 1-го уровня.Если он находит его, он копирует состояние из аргумента в экземпляр в кэше.Грязная проверка гарантирует, что он будет сброшен в базу данных.merge и, в свою очередь, save также возвращают сущность, которая была найдена в кэше 1-го уровня.

Поскольку вы загрузили e1 из базы данных в той же транзакции, она находится в кэше 1-го уровня и получаетмодифицировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...