Я пытаюсь получить несколько родительских объектов, например, несколько тысяч как минимум. Меня мучают проблемы с производительностью, даже несмотря на то, что я использую граф сущностей, запрос извлекает набор результатов за 30 с лишним секунд. Представьте, что есть родительская сущность MatchStatistics, дочерний MVP-игрок, PrizeMoney и команды дочерних сущностей.
Допущения
- Статистика матча оценивается для.
- Национальные команды
- Международные команды
- Национальные и международные команды
По существу, существует сценарий, в котором могут быть обнуляемые национальные или международные команды.
@Entity(name=matches)
public class MatchStatistics
@Id
private int Id;
private DateTime date;
@ManyToOne
private Player mvpPlayer;
@ManyToOne
private Prize prizeMoney;
@OneToMany
@JoinColumn(name = "home_team_id", referencedColumnName = "team_id")
private Set<Team> nationalTeam;
@OneToMany
@JoinColumn(name = "away_team_id", referencedColumnName = "team_id")
private Set<Team> internationalTeam;
Team Entity
@Entity(name = team)
public class Team
@Id
private int id;
@ManyToOne
private MatchStatistics homeStat;
@ManyToOne
private MatchStatistics awayStat;
@OneToMany
private Set<Sponsor> sponsors;
Когда я запрашиваю объект MatchStatistics, я ожидаю получить всю информацию , Итак, я попробовал граф сущностей так, чтобы вся информация выбиралась за один раз. У меня есть эта сущность matchstatistics
@NamedEntityGraph(name = "match-statistic",
includeAllAttributes = true,
attributeNodes = {
@NamedAttributeNode(value = "mvpPlayer"),
@NamedAttributeNode(value = "nationalTeam", subgraph = "team-graph"),
@NamedAttributeNode(value = "internationalTeam", subgraph = "team-graph")
},
subgraphs = {
@NamedSubGraph(name = "team-graph", attributeNodes = {
@NamedAttributeNode(value = "id"),
@NamedAttributeNode(value = "homeStat", subgraph = "match-graph"),
@NamedAttributeNode(value = "awayStat", subgraph = "match-graph"),
@NamedAttributeNode(value = "sponsors")
},
@NamedSubGraph(name = "match-graph", attributeNodes = {
@NamedAttributeNode(value = "id"),
@NamedAttributeNode(value = "date"),
@NamedAttributeNode(value = "mvpPlayer"),
@NamedAttributeNode(value = "prizeMoney")
}
})
У меня есть подграфы, чтобы избежать бесконечных рекурсий или объединений. Теперь, где бы я ни пытался получить статистику соответствия, поведение не соответствует. Иногда он может получить данные, используя один запрос, но иногда он прерывает и запускает несколько запросов, чтобы получить дочерние элементы, такие как выигрышный денежный приз, mvpPlayer для каждого дочернего национального или интернационального команды, или когда-нибудь отдельно получить график соответствия. Это немного нестабильно. Вышеуказанное отношение сущности приведено только для примера, оно не актуально. Я согласен, что ассоциация может не иметь смысла, я просто использовал это для объяснения.
То, что я пытался
- Я пытался избежать n + 1 запросов избегая EAGER получить в любом месте. Я попытался выполнить следующие действия: https://thoughts-on-java.org/hibernate-tip-entitygraph-multiple-subgraphs/.
- Я думаю, что может возникнуть открытая проблема с Hibernate, когда вы попытаетесь использовать граф сущностей для сущности, имеющей ассоциации @OneToMany и @ManyToOne. Я вижу то же самое, что и проблема, указанная здесь: https://hibernate.atlassian.net/browse/HHH-12897
- Я пытался, в основном HQL, передать подсказку fetchgraph в запрос.
Есть ли способ исправить декартову проблему? или сделать его более стабильным.