Size: a a a

2021 May 11

S

Sergey in pro.jvm
всем привет

есть проблемка в onetomany, нужна помощь)

первая проблема:
есть владелец связи base и дочка building.
вызываю toString у объекта base, base подтягивает bulding, а bulding имела id base и подтягивала base. забавно, что toString заставлял хибернейт ходить в базу и тащить building, хотя fetch стоит lazy. изменил toString (убрал связные поля(base и building) и проблема ушла (нашел тут решение https://stackoverflow.com/questions/54570757/stack-overflow-on-hibernate-caused-by-one-to-many-relationship), но появилась вторая НеБагАфича

вторая (неБагАфича): при маппинге json, я полагаю, юзается getter, setter что возвращает к проблеме 1, но без looping, маппинг также может пнуть хибернейт в базу за сущностью дочерней.
кидаю запрос entityManager.find(Starbase.class, id), а прилетает base с связной дочкой building.  
есть на стаке (https://stackoverflow.com/questions/30082281/manytoonefetch-fetchtype-lazy-doesnt-work-on-non-primary-key-referenced-co), но я не знаю как сделать правильно, а не костыльно.

как решать вторую проблему элегантно и адекватно?
источник

Д

Дмитрий in pro.jvm
Привет, это поможет тебе конвертировать объект в Json только с теми полями, которые ты определишь... https://www.baeldung.com/jackson-json-view-annotation  т.е. ставишь building на другой View, и когда мапишь - выбираешь через какое Views мапить объект
источник

Д

Дмитрий in pro.jvm
и для Json лучше использовать DTO а не Entity
источник

S

Sergey in pro.jvm
Проект на springboot, поэтому к маппингу в json не касался. Марпер только на входящий json юзал.

в dto в сервисе складывать?
источник

S

Sergey in pro.jvm
И еще вопрос: почему при toString hibernate делает select в базу?
источник

Д

Дмитрий in pro.jvm
ты можешь dto принимать в контроллере, далее в сервисе или работать с dto, или перед сервисом конвертировать dto в entity с помощью конвертора ( getter | setter ).
источник

S

Sergey in pro.jvm
Спасибо, Дмирий, завтра буду изучать, а то уже у меня час ночи
источник

Д

Дмитрий in pro.jvm
скорее всего из-за того, что у тебя есть внешняя зависимость ( building ), и для того, что бы отобразить все её поля - хибернейту нужно сначала их получить из базы
источник

S

Sergey in pro.jvm
Fetchtype=lazy игнорируется при этом?
источник

Д

Дмитрий in pro.jvm
Да, если у тебя в методе toString будет поле которое lazy -> hibernate сначала его достанет, а потом выдаст тебе строку\
источник

S

Sergey in pro.jvm
Как тогда в огромных таблицах manytomany происходит? Hibernate ж пойдет со своим select и с концами?))

Вижу эти лишние действия и понимаю, что я что-то не учел и копаюсь, два дня копаюсь
источник

Д

Дмитрий in pro.jvm
для таких таблиц чаще запросы пишутся ручками в репозитории ( https://www.baeldung.com/spring-data-jpa-query )
источник

S

Sergey in pro.jvm
Спасибо за ответы)
источник

AE

Alexandr Emelyanov in pro.jvm
Он не игнорируется, у тебя на лэзи связи в поле ставится прокси, toString когда дёргает на этой прокси какие либо методы hibernate подтягивает данные
источник

AE

Alexandr Emelyanov in pro.jvm
Все легально и логично
источник
2021 May 12

VB

Vladislav Bondarchuk in pro.jvm
Все что lazy - дёргается по запросу. Для маппинга в DTO и обратно без рефлексии удобно использовать http://modelmapper.org/user-manual/property-mapping/
источник

AE

Alexandr Emelyanov in pro.jvm
> без рефлексии
> modelmapper

вы похоже не знаете что такое рефлексия или как работает ваш маппер
источник

AE

Alexandr Emelyanov in pro.jvm
вот мапстракт без рефлексии, да
источник

Д

Дмитрий in pro.jvm
я прежложил пройти по пути найменьшего сопротивления, т.к. у человека был вопрос как вытянуть из базы many to many,  то мапить в mapstruct те ещё пляски с бубном ( особенно если впервые )
источник

AE

Alexandr Emelyanov in pro.jvm
да ну. нет там никаких плясок. а советовать моделмаппер - зашквар.

да и маппить mtm проблемы не вижу. просто не делать обратных связей в дто и сделать фетч
источник