У меня есть простой @Entity
с парой полей @ManyToOne
. Я выбираю дочерние объекты из базы данных и хочу просто создать новый экземпляр родительского объекта и сохранить его в базе данных.
Когда я вызываю myRepository.save(myParentObject)
, Hibernate сначала делает несколько нажатий , по одному на каждое поле, помеченное @ManyToOne
, а в журналах написано очень четко Getting current persistent state for: [...]
. Только после того, как эти 2 операции выбора завершены, вставка, наконец, происходит.
Единственное решение, которое я нашел для предотвращения этих нежелательных операций select
, - это объявление идентификаторов дочерних объектов как @GeneratedValue(strategy = GenerationType.IDENTITY)
. Я использую натуральные идентификаторы, так что это не имеет смысла, и я бы хотел этого избежать. Реализация Persistable
на дочерних экземплярах не имела никакого значения. Как избежать ненужных выборов, не используя @GeneratedValue
s?
@Entity
public class NewspaperArticle {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotNull @ManyToOne @JoinColumn(name="release")
private ReleaseInfo releaseInfo;
(...)
}
@Entity
@Table(name = "release_info")
public class ReleaseInfo implements Persistable<LocalDate> {
// removing @GeneratedValue here causes an additional fetch to happen
// before a save() on NewspaperArticle happens
@Id @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY)
private LocalDate canonicalDate;
(...)
}
UPDATE Такой вызов
Optional<ReleaseInfo> maybeRelease = releaseInfoRepository.findById(<date>);
NewspaperArticle article = new NewspaperArticle();
article.setReleaseInfo(maybeRelease.get());
newspaperArticleRepository.save(article);
сгенерирует этих журналов