Как Hibernate создает запрос?Как избежать достижения лимита в 61 стол? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть Java Class X, который на самом деле является сущностью, подключенной к Spring Data JPA.Он имеет аннотацию: @Entity (javax.persistence.Entity)

В последнее время мы добавили столбец / член к этому классу, и это стало причиной того, что этот класс извлекается из базы данных с помощью Spring DataJPA (яне совсем уверен, как это назвать), я получаю известную ошибку:

Исключение: слишком много таблиц;MariaDB может использовать только 61 таблицу в объединении - не удалось извлечь ResultSet

Мне не нужно так много объединений, я просто понял, что JPA создает много объединений, чтобы быть на более безопасной стороне.

Мой вопрос: как мне минимизировать мой класс, чтобы сделать так, чтобы было меньше соединений?

Я просмотрел членов моего класса X,

и нашелбыло 25 полей, которые подключаются к другим «таблицам класса-сущности».

Некоторые из них связаны с OneToMany, а некоторые с ManyToOne.

Так что это не 61.

Я заметилчто вышеупомянутая ошибка была вызвана при попытке извлечь другой класс сущности Y, что два ее члена имеют тип X.

Я попытался свернуть один из членов класса сущности X, но это неhelp.

Итак, еще один мой вопрос: как JPA создает автоматически сгенерированный запрос (как объяснено здесь )?Понимание этого сделает для меня намного яснее и проще избежать этой ошибки, устранить ошибку, если она проявляется, и, что более важно, - организовать организации моего класса более эффективно.

Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Hibernate очень хорош в построении запросов для получения только необходимых данных, поэтому, если он создает объединение с более чем 61 таблицей, у вас действительно возникнут проблемы с вашими сущностями!

Если ваша сущность A имеетесли B и B имеют C, то Hibernate может попытаться прочитать оба A, B и C в одном запросе.Это называется энергичной нагрузкой.Часто это правильно, чтобы избежать обходов, но если у вас много ссылок на другие объекты, это может быть проблематично.

На мой взгляд, у вас есть два варианта.Во-первых, уменьшить количество ссылок на другие объекты, которые у вас есть.Другой - пометить некоторые объекты для отложенной загрузки.Таким образом, они не должны быть загружены в основной выбор.Однако, если они вам нужны, они будут получены позже, что может привести ко многим последующим выборам.Это также может быть дорого.

Трудно быть более конкретным, не зная ваших сущностей, но начните пытаться очистить модель, а затем прочитать о ленивой загрузке.Удачи!

...