Хранит ли объект JPA ссылку на Entity Manager?

#java #spring #spring-boot #spring-data-jpa #hibernate-entitymanager

#java #spring #весенняя загрузка #spring-data-jpa #переход в спящий режим-entitymanager

Вопрос:

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

Я использую вышеупомянутый объект entity в качестве ключа в 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
}
  

Я выясняю, что мой хэш-ключ (e1) также изменен (на e2). Теперь, поскольку Hashmap использует объекты «Entry», где ключом будет объект сущности Employee (который был изменен), объекты JPA ссылаются на объекты, хранящиеся в Entity manager? Поэтому ключ изменился?

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

Комментарии:

1. Вы делаете это внутри транзакции?

2. Entity Manager сохраняет объект cashed до тех пор, пока вы его не отсоедините. И загрузите объект с помощью id из кэша. Так что, вероятно, вы меняете связанный объект. Попробуйте отсоединить объект после сохранения

3. О каком именно ключе вы говорите?

4. @JensSchauder Ключ в HashMap obv

5. @IharSadounikau как только я сохраняю, ключ HashMap изменяется. Похоже, что объект Entry<Employee, значение> в Hashmap каким-то образом содержит ссылку на сохраненный объект.

Ответ №1:

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

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

Комментарии:

1. Итак, e1 содержит ссылку, которая указывает на экземпляр объекта в кэше 1-го уровня?