Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA много @OneToOne / 25 сообщений из 79, страница 1 из 4
01.07.2016, 13:49
    #39266364
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
В ентити очень много @OneToOne и @ManyToOne, хибернейт делает join с ними даже когда они не нужны. FetchLazy не помогает. Какой самый простой способ это решить?
...
Рейтинг: 0 / 0
01.07.2016, 14:09
    #39266395
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892,

FetchLazy не помогает, если ORM не может создать прокси на сущность. А прокси ORM не может создать, когда нет интерфейсов для сущностей, нет нужных либ в classpath для создания прокси без интерфейсов или такая фича отключена вовсе. О каком провайдере речь? Хибер?
...
Рейтинг: 0 / 0
01.07.2016, 14:11
    #39266398
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Blazkowicz,
Да, а что мне надо добавить в classpath?
...
Рейтинг: 0 / 0
01.07.2016, 14:12
    #39266401
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892Blazkowicz,
Да, а что мне надо добавить в classpath?
javassist вроде.
...
Рейтинг: 0 / 0
01.07.2016, 14:38
    #39266445
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
В логах он вроде его и использует:
: HHH000021: Bytecode provider name : javassist
А после получения энтити никаких прокси там нет почему-то - обычные pojo.
...
Рейтинг: 0 / 0
01.07.2016, 14:54
    #39266460
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Тогда странно. ManyToOne должен был работать.
Для OneToOne могут быть ещё ограничения
http://stackoverflow.com/questions/1444227/making-a-onetoone-relation-lazy
...
Рейтинг: 0 / 0
01.07.2016, 15:04
    #39266473
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Blazkowicz,
Да, с optional false заработало @OneToOne.
Спасибо огромное!

PS А что делать если нужен null?
...
Рейтинг: 0 / 0
01.07.2016, 15:07
    #39266480
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892Blazkowicz,
Да, с optional false заработало @OneToOne.
Спасибо огромное!

PS А что делать если нужен null?

Для nullable one-to-one ассоциаций в принципе нельзя оптимизировать через ленивую загрузку, потому что единственный способ узнать null у нас или ленивое значение это сделать выборку из обоих таблиц. И при этом смысл в ленивости отпадает.
...
Рейтинг: 0 / 0
04.07.2016, 10:35
    #39267149
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892В ентити очень много @OneToOne и @ManyToOne, хибернейт делает join с ними даже когда они не нужны. FetchLazy не помогает. Какой самый простой способ это решить?

Самый простой - вытаскивать DTO только то что вам нужно ...

пишите тесты смотрите какие запросы строятся - благо тесты очень легковесные и простые

https://github.com/xpinjection/hibernate-performance/tree/master/src/test/java/com/jeeconf/hibernate/performancetuning/readonly

переосмыслить вашу модель еще раз .
...
Рейтинг: 0 / 0
04.07.2016, 12:54
    #39267260
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Atum1,
Это как?
...
Рейтинг: 0 / 0
04.07.2016, 14:03
    #39267328
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892Atum1,
Это как?

авторВ ентити очень много @OneToOne

Это как ?

Решение :
вытаскивать только то что вам нужно в ридонли моде и в виде DTO чтобы не тянуть все эти @OneToOne - если у вас там дерево , как вариант к примеру сотрудников - то обычный рабочий рискует вытащить всех своих руководителей ...а те в свою очередь все необходимые им @OneToOne объекты ... в итоге имеет n+1 запрос но наоборот :) итд ...
...
Рейтинг: 0 / 0
04.07.2016, 14:08
    #39267330
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Atum1,
Так это ж ридонли + еще нужно dto городить параллельно энтити классам, а если вам нужны OneToMany там? Вручную резалтсет парсить? И это еще и без обновлений...
...
Рейтинг: 0 / 0
04.07.2016, 14:56
    #39267392
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892Atum1,
Так это ж ридонли + еще нужно dto городить параллельно энтити классам, а если вам нужны OneToMany там? Вручную резалтсет парсить? И это еще и без обновлений...

Опишите вашу модель и алгоритм работы с ней ... ?! что она из себя представляет.

ИМХО идеально использовать entity только для операций сохранения(вставки объектов в БД) ,
все остальные операции (выборки из базы, особенно в вашей объектной модели ) - очень жесткий удар по перфомансу.

И не нужно городить - используйте только dto и тащите ТОЛЬКО все что вам нужно .

Используйте паттерн CQRS место Repository .


Писать в стиле CQRS для JPA это и есть серебряная пуля этой технологии :) поверьте .

Ибо
Ваша модель entity классов - это коде ферст если вы ведете разработку через нее - нужна только для генерации базы данных , простановки констрейтов и индексов ...

Использовать эти объекты в других слоях и их тем более отдавать их сразу клиенту или на view это преступление .

Вы небось и OpenSessionInViewFilter используете ?


Примите за правило что писать запросы все равно нужно и , поверье они будут на два порядка эффективнее чем то , через что вы будете работать если сконфигурируете свою модель через entity...


К тому же у вас каждый раз используя DTO развязаны руки в определении equals hashcode contract

возьмите себе немного времени и подумайте об этом .


Не нужно поддаваться искушению - я ничего не буду писать - лишь опишу свою объектную модель, а ORM все будет делать за меня ...
...
Рейтинг: 0 / 0
04.07.2016, 14:57
    #39267394
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892Atum1,
если вам нужны OneToMany там? Вручную резалтсет парсить? И это еще и без обновлений...

так же скинул я пример кода .

если нужны пишете запрос на fetch join - других вариантов нет .
...
Рейтинг: 0 / 0
04.07.2016, 15:08
    #39267409
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Atum1
equals hashcode contract


+ toString()

как вы будите писать?
...
Рейтинг: 0 / 0
04.07.2016, 15:33
    #39267440
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Atum1Используйте паттерн CQRS место Repository .
эк тебя качнуло в совершенно другую ипостась. Еретик)).
...
Рейтинг: 0 / 0
04.07.2016, 18:07
    #39267597
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Petro123Atum1Используйте паттерн CQRS место Repository .
эк тебя качнуло в совершенно другую ипостась. Еретик)).

:)

а какие варианты ? тем более когда у него OneToOne ?

он же указав везде FetchLazy - посто будет получать ошибку инициализации на каком то другой уровне - ближе к клиенту ... или не будет ,если у него под рукой есть сессия :)

что тоже черевато :)

ps в самом простом варианте для OneToOne

CQRS - это когда много маленьких запросов - классов вместо одного большого "волшебного " Repository .
...
Рейтинг: 0 / 0
04.07.2016, 18:14
    #39267604
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@NoRepositoryBean
public interface AbstractRepository<T , ID extends Serializable>  extends JpaRepository<T, ID>,JpaSpecificationExecutor<T>{
    
}

есть метод 

public List<T> findAll(Specification<T> spec)



что дает вам один универсальный метод для всего :)
...
Рейтинг: 0 / 0
04.07.2016, 18:23
    #39267609
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Atum1,
Круто!
А можешь показать, как ты вытащишь хотя-бы два вложенных списка без хибера?)))
...
Рейтинг: 0 / 0
04.07.2016, 18:31
    #39267614
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
авторон же указав везде FetchLazy - посто будет получать ошибку инициализации на каком то другой уровне - ближе к клиенту ... или не будет ,если у него под рукой есть сессия :)
Для этого есть join fetch, правда столкнулся с тем что нельзя указать доп условие в on, через where не получится, пришлось с другой стороны графа вытаскивать.

авторИспользовать эти объекты в других слоях и их тем более отдавать их сразу клиенту или на view это преступление
Энтити это обычные pojo, какая разница. В чем преступление то?

авторПримите за правило что писать запросы все равно нужно и , поверье они будут на два порядка эффективнее чем то , через что вы будете работать если сконфигурируете свою модель через entity...
Откуда такие цифры?

авторК тому же у вас каждый раз используя DTO развязаны руки в определении equals hashcode contract
Они и так развязаны.

авторВаша модель entity классов - это коде ферст если вы ведете разработку через нее - нужна только для генерации базы данных , простановки констрейтов и индексов ...
Жееесть!

Все, жду парсинг резалтсета с 2мя списками
...
Рейтинг: 0 / 0
04.07.2016, 18:37
    #39267619
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
авторCQRS - это когда много маленьких запросов - классов вместо одного большого "волшебного " Repository .
Ушли от n+1 и к чему пришли оказывается...
...
Рейтинг: 0 / 0
04.07.2016, 22:20
    #39267670
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
Atum1CQRS - это когда
я просто не увидел там что то крутого. Этой технологии ведь уже лет 8?
...
Рейтинг: 0 / 0
05.07.2016, 15:16
    #39268043
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892авторCQRS - это когда много маленьких запросов - классов вместо одного большого "волшебного " Repository .
Ушли от n+1 и к чему пришли оказывается...

почему? будет 1 запрос .... а не n+1 /

если n+1 классов - то да . будет много маленьких классов ... Это как присать plsql процедуры - под каждый чих свой plsql -процедурку - типа АПИ к БД на прроцедурах.

n+1 класс с запросами проще тестировать через TDD :)


а один большой Repository - это попахивает Антипаттерном "Волшебный сервлет"


Petro123Atum1CQRS - это когда
я просто не увидел там что то крутого. Этой технологии ведь уже лет 8?

наверное мы по разному видим и понимаем CQRS :)
...
Рейтинг: 0 / 0
05.07.2016, 15:19
    #39268047
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892Atum1,
Круто!
А можешь показать, как ты вытащишь хотя-бы два вложенных списка без хибера?)))

А можно для начала модель вашу и как вы это делаете ?

и тестик :) и количество sql запросов которые генерит хибер :)?

ps как буду делать ( тут все зависит от тех данных что у вас и их количества , может у вас там коллекции по 10 млн обхектов):

а так ну либо обычным
Jpql | hql | критерия апи | нативным sql | entitygraph


кстати entitygraph - настоятельно рекомендую для вашего решения :) jpa 2.1
...
Рейтинг: 0 / 0
05.07.2016, 15:31
    #39268061
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA много @OneToOne
no56892Atum1,
Круто!
А можешь показать, как ты вытащишь хотя-бы два вложенных списка без хибера?)))

такое решение вас устроит ?
Код: java
1.
2.
3.
4.
5.
6.
7.
List<Object[]> results = ((Session)this.em.getDelegate()).createSQLQuery("SELECT {b.*}, {a.*} FROM Book b JOIN Author a ON b.author_id = a.id").addEntity("b", Book.class).addEntity("a", Author.class).list();
results.stream().forEach((record) -> {
    Book book = (Book) record[0];
    Author author = (Author) record[1];
    System.out.println("Author: ID [" + author.getId() + "] firstName [" + author.getFirstName() + "] lastName [" + author.getLastName() + "]");
    System.out.println("Book: ID [" + book.getId() + "] title[" + book.getTitle() + "]");
});



Код: java
1.
2.
3.
4.
5.
6.
7.
List<Object[]> results = this.em.createNativeQuery("SELECT b.id, b.title, b.author_id, b.version, a.id as authorId, a.firstName, a.lastName, a.version as authorVersion FROM Book b JOIN Author a ON b.author_id = a.id", "BookAuthorMapping").getResultList();

results.stream().forEach((record) -> {
    Book book = (Book)record[0];
    Author author = (Author)record[1];
    // do something useful
});



http://www.thoughts-on-java.org/result-set-mapping-complex-mappings/

http://www.thoughts-on-java.org/result-set-mapping-hibernate-specific-mappings/


авторПримите за правило что писать запросы все равно нужно и , поверье они будут на два порядка эффективнее чем то , через что вы будете работать если сконфигурируете свою модель через entity...

Откуда такие цифры?

А вы не забывайте про dirtychecking ?!

или вы думаете ,что те 100500 абстракций что у вас навешаны вокруг jdbc конеекта к БД бесплатные ?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA много @OneToOne / 25 сообщений из 79, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]