#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-го уровня?