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 в своих сопоставлениях, а затем указывать соответствующие извлечения соединения во время запроса, что обеспечивает наиболее детальный контроль.