У меня есть простое приложение учетной записи пользователя, в котором пользователь может изменять свои данные.
Обновление базы данных
Метод управляемого компонента, который принимает параметры формы и вызывает метод Service:
public String changeDetails(){
Date date = DateUtil.getDate(birthDate);
Integer id = getAuthUser().getId();
UserDetail newDetails = new UserDetail(id, occupation, date, originCity, residenceCity, description);
EntityTransaction transaction = getTransaction();
userService.updateDetail(newDetails);
transaction.commit();
return null;
}
Способ обслуживания:
public boolean updateDetail(UserDetail newDetails) {
boolean ok = true;
if (newDetails != null) {
UserDetail user = readDetail(newDetails.getId());
user.setOccupation(newDetails.getOccupation());
user.setOriginCity(newDetails.getOriginCity());
user.setResidenceCity(newDetails.getResidenceCity());
user.setBirth(newDetails.getBirth());
user.setDescription(newDetails.getDescription());
}
return ok;
}
Извлечение данных из БД
@PostConstruct
public void init(){
userService = new UserService();
sessionController.setAuthUser(userService.read(getAuthUser().getId()));
originCity = getAuthUser().getUserDetail().getOriginCity();
residenceCity = getAuthUser().getUserDetail().getResidenceCity();
occupation = getAuthUser().getUserDetail().getOccupation();
birthDate = DateUtil.getStringDate(getAuthUser().getUserDetail().getBirth());
description = getAuthUser().getUserDetail().getDescription();
}
Проблема в том, что поведение этого кода отличается. Иногда я получаю желаемый результат: как только я отправляю новые данные и набираю @PostConstruct init ()
, новые данные печатаются. Иногда другие старые данные печатаются, хотя запись в БД обновляется.
Вывод: Иногда JPA приносит мне результат, отличный от того, что находится в БД. Я предполагаю, что эти результаты состоят из данных из контекста персистентности, данные, которые не обновляются. Есть ли способ, которым я могу быть уверен, что JPA всегда приносит данные непосредственно из БД? Или мне чего-то не хватает?