Вы все еще можете проходить однонаправленные ассоциации между сущностями, создавая свои запросы, используя выборочные объединения. Таким образом, связанные объекты включаются в гидратированный набор результатов, возвращаемый запросом.
Если вам по-прежнему необходимо более глубоко обойти граф объектов в обратной стороне, вы можете добавить еще одно объединение к вашему запросу, которое ссылается на связанную сущность обратного. С точки зрения производительности, однонаправленные соединения извлечения обычно предпочтительнее, чем преобразование связей в двунаправленные, поскольку таким образом вы можете контролировать, какие связанные сущности загружаются и когда.
Также обратите внимание, что даже если вы действительно преобразовали ассоциации в двунаправленные, вы фактически не «перестраиваете базу данных». Вы бы только добавляли новые свойства к обратным сторонам ваших отношений. Это не добавит никаких новых полей в саму базу данных.
Что касается добавления / использования пользовательских репозиториев, это само по себе не повлечет за собой никаких накладных расходов. Пользовательские репозитории - это просто места для хранения запросов и другой логики домена, специфичной для данного объекта. Фактически, кодирование пользовательских запросов в ваших классах репозитория может быть более эффективным, чем попытка сделать запрос, используя только методы репозитория по умолчанию, такие как find () и findAll (), которые автоматически загружают связанные объекты, нужны они вам или нет.