Как избежать получения дочерних сущностей @ManyToOne при сохранении в Spring Data Jpa? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть простой @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);

сгенерирует этих журналов

...