Настройка производительности Hibernate для выборки нескольких OneToMany (между двумя таблицами) и ManyToOne через Entity Graph - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь получить несколько родительских объектов, например, несколько тысяч как минимум. Меня мучают проблемы с производительностью, даже несмотря на то, что я использую граф сущностей, запрос извлекает набор результатов за 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 для каждого дочернего национального или интернационального команды, или когда-нибудь отдельно получить график соответствия. Это немного нестабильно. Вышеуказанное отношение сущности приведено только для примера, оно не актуально. Я согласен, что ассоциация может не иметь смысла, я просто использовал это для объяснения.

То, что я пытался

  1. Я пытался избежать n + 1 запросов избегая EAGER получить в любом месте. Я попытался выполнить следующие действия: https://thoughts-on-java.org/hibernate-tip-entitygraph-multiple-subgraphs/.
  2. Я думаю, что может возникнуть открытая проблема с Hibernate, когда вы попытаетесь использовать граф сущностей для сущности, имеющей ассоциации @OneToMany и @ManyToOne. Я вижу то же самое, что и проблема, указанная здесь: https://hibernate.atlassian.net/browse/HHH-12897
  3. Я пытался, в основном HQL, передать подсказку fetchgraph в запрос.

Есть ли способ исправить декартову проблему? или сделать его более стабильным.

...