У меня есть JpaRepository, сохраняющийся вновь созданный объект в приложении Spring MVC. Эта структура выглядит следующим образом (очень упрощенный):JpaRepository кэширует новый объект. Как его обновить?
@Entity
public class Translation {
.....
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
private Version version;
....
}
и версия сущность:
@Entity
public class Version {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "version_code")
private long code;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "version", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Set<Translation> translations;
}
создать объект перевода, как этот
TranslationDTO t = new TranslationDTO();
t.setText(translationText);
ClientVersionDTO version = new ClientVersionDTO();
version.setId(11);
t.setVersion(version);
где 11 является версия, которая существует в база данных уже с самого начала. Обратите внимание, что я не устанавливаю значения для name
и code
ClientVersionDTO.
Тогда у меня есть сервис, который сохраняется новый объект (я использую dozer
библиотеки для преобразования DTO организаций)
@Service
@Transactional
public class TranslationsServiceImpl implements TranslationsService {
@Override
public Long create(TranslationDTO translationDTO) {
Translation translation = translationsConverter.unconvert(translationDTO);
Translation t = translationRepository.saveAndFlush(translation);
Translation t2 = translationRepository.findOne(t.getId());
// !!!! t2.getVersion() returns version where no values are set to 'code' and 'name'
return t2.getId();
}
}
Обрати внимание мой комментарий «t2.getVersion() возвращает версию, где значения не установлены в ' code 'и' name '"- Я ожидал, что, когда я извлечу данные из базы данных, я бы получил объект Version
прямо из базы данных с установленными значениями code
и name
. Однако они не установлены. Таким образом, в основном то, что я получаю как объект t2.getVersion()
, это тот же объект, что и входной аргумент translationDTO.getVersion()
. Как они могут повторно аннулировать объект Version
?
UPDATE попытался переместить @Transactional в JpaRepository, но все тот же результат.
Возможно, вы имеете в виду «Spring MVC»? Это потому, что вы написали «Sprint MVC» – AlexR
Да, спасибо. Изменены опечатки. –
Попробуйте переместить @Transactional в свой репозиторий для теста –