Java Spring Hibernate, Runtime при желании выполнять сопоставления?

В моей базе данных у меня есть электронная кампания, в которой есть список от одного до многих, список имеет много подписчиков.

У меня проблема, например, в том, что когда я запускаю кампанию, мне не всегда нужны все подписчики (может быть много подписчиков, которые хотят видеть только разные кампании).

При создании сопоставления есть ли способ по выбору сделать сопоставления (во время выполнения решить)? Или каково решение проблемы? Должен ли я просто извлечь все из базы данных и вывести запрашиваемую часть? Похоже, много накладных расходов.

1 ответ

Решение

Я собираюсь предположить, что у вас есть некоторые сопоставления, аналогичные приведенным ниже, основанные на том, как вы описали свою модель данных (обратите внимание, я оставляю тип выборки по умолчанию для LAZY).

@Entity
public class Campaign {
  // ...
  @OneToMany
  private List<MailingList> lists;
}

@Entity
public class MailingList {
  // ...
  @ManyToMany
  private List<Subscriber> subscribers;
}

@Entity
public class Subscriber {
  // ...
}

Если вы хотите получить Campaign юридические лица и связанные с ними MailingList отношения, вы можете легко сделать это в HQL/JPQL следующим образом:

FROM Campaign c JOIN FETCH c.lists

Это не будет получать список подписчиков, потому что @ManyToMany ассоциация по умолчанию ленива и поэтому будет извлечена только тогда и только тогда, когда вам нужно будет позвонить getSubscribers(),

Вы всегда должны отдавать предпочтение извлечению LAZY в своих сопоставлениях, а затем указывать соответствующие извлечения соединения во время запроса, что обеспечивает наиболее детальный контроль.

Другие вопросы по тегам