powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA много @OneToOne
79 сообщений из 79, показаны все 4 страниц
JPA много @OneToOne
    #39266364
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ентити очень много @OneToOne и @ManyToOne, хибернейт делает join с ними даже когда они не нужны. FetchLazy не помогает. Какой самый простой способ это решить?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39266395
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,

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

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

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

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

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

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

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

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

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

Это как ?

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

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

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

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

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


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

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

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

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


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


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

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


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

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

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


+ toString()

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

:)

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

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

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

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

CQRS - это когда много маленьких запросов - классов вместо одного большого "волшебного " Repository .
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39267604
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
JPA много @OneToOne
    #39267609
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
Круто!
А можешь показать, как ты вытащишь хотя-бы два вложенных списка без хибера?)))
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39267614
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторон же указав везде FetchLazy - посто будет получать ошибку инициализации на каком то другой уровне - ближе к клиенту ... или не будет ,если у него под рукой есть сессия :)
Для этого есть join fetch, правда столкнулся с тем что нельзя указать доп условие в on, через where не получится, пришлось с другой стороны графа вытаскивать.

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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


кстати entitygraph - настоятельно рекомендую для вашего решения :) jpa 2.1
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268061
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JPA много @OneToOne
    #39268082
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1наверное мы по разному видим и понимаем CQRS :)
возможно. Но:
- оракл не делит транзакции на читающие и пишущие. Зачем мне тогда это?
- не понял про необходимость устройства доп.БД _читающей_.
IMHO
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268145
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
только вот забыли основной "кусище" добавить (и здесь колонок не много еще):
автор<sql-result-set-mapping name="BookAuthorMappingXml">
<entity-result entity-class="org.thoughts.on.java.jpa.model.Author">
<field-result name="id" column="authorId"/>
<field-result name="firstName" column="firstName"/>
<field-result name="lastName" column="lastName"/>
<field-result name="version" column="authorVersion"/>
</entity-result>
<entity-result entity-class="org.thoughts.on.java.jpa.model.Book">
<field-result name="id" column="id"/>
<field-result name="title" column="title"/>
<field-result name="author" column="author_id"/>
<field-result name="version" column="version"/>
</entity-result>
</sql-result-set-mapping>

А что там за dirtychecking если вытаскивать для чтения?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268162
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892А что там за dirtychecking если вытаскивать для чтения?
Если вытаскивать в read-only, то dirty checking, как раз не будет.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268266
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Atum1наверное мы по разному видим и понимаем CQRS :)
возможно. Но:
- оракл не делит транзакции на читающие и пишущие. Зачем мне тогда это?
- не понял про необходимость устройства доп.БД _читающей_.
IMHO



Папа все понял... ну это уж совсем классическое описание паттерна.... я же говорил про его идею и маленькую часть....
А так да Там же и cap теорема всплывает и пр.пр...

Нужно Писать классы запросы на dsl языке и исполнять их .... как у с# есть linq язык..... Прада на java реализации счас очень стремная)
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268268
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczno56892А что там за dirtychecking если вытаскивать для чтения?
Если вытаскивать в read-only, то dirty checking, как раз не будет.


Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268283
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,
только вот забыли основной "кусище" добавить (и здесь колонок не много еще):
автор<sql-result-set-mapping name="BookAuthorMappingXml">
<entity-result entity-class="org.thoughts.on.java.jpa.model.Author">
<field-result name="id" column="authorId"/>
<field-result name="firstName" column="firstName"/>
<field-result name="lastName" column="lastName"/>
<field-result name="version" column="authorVersion"/>
</entity-result>
<entity-result entity-class="org.thoughts.on.java.jpa.model.Book">
<field-result name="id" column="id"/>
<field-result name="title" column="title"/>
<field-result name="author" column="author_id"/>
<field-result name="version" column="version"/>
</entity-result>
</sql-result-set-mapping>

А что там за dirtychecking если вытаскивать для чтения?



Так все это можно и через dto класс описать там же есть пример .


Вы теперь свое чудо решение покажите !?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268284
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто.


В том плане что недостаточно указать просто транзакцию как ридонли .... нужно обязательно указать флаг ридонли в true.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268285
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто.


В том плане что недостаточно указать просто транзакцию как ридонли .... нужно обязательно указать флаг ридонли в true.
А
Либо через StatelessSession тянуть.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268287
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я конечно туплю, но "dirty checking" - что Вы под этими словами подразумеваете?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268291
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Или добавить @Immutable над классом)
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268299
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

То что сам производитель и создатель хибернейта... плюс это куча абстракций...куча оберток... куча проксей и конечно же кеш... что очень улучшает вашу жизнь и делает оцбой ваш запрос на порядок а то и два медленнее)
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268301
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот наверное самое простое описание для другого фреймворка ,но и для хибера подходит


Dirty checking
По этому принципу работает AngularJS. Dirty checking — это проверка на изменененность данных, простая как два рубля. Раньше переменная myVar была 1, теперь она 2 — значит данные изменились и надо их в шаблоне перерисовать. Для простых переменных это оператор !=, для сложных — соответствующие легковесные процедуры. Это простейший подход, который избавляет нас как от необходимости работать с данными через специальный «слушающий» слой, так и от всех проблем, связанных с зависимостями данных.




Что в свою очередь ведёт нас к вопросу равенства двух объектов на уровне jvm и на уровне базы данных ..... я уже спрашивал по этому поводу автора как он пишет хешкод и иквалс и тостринг.... но ответа не было....
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268305
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
Мда смешались в кучу люди кони, имххо у вас какая то каша в голове. Дирти чек это когда передаешь ентити весь граф на мердж, и оно там ищет какие объекты поменялись чтобы сгенить апдейт инсерт делает. Иквалс хэшкод по айдишнику.ту стринг нафиг не нужен. Выборка через джипикуэл. Да кстати я просил два вложенных списка)) видимо задачки для собеседования пошли во вред)) без обид
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268309
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут как вариант пример

http://rsdn.ru/forum/java/4586631.all


Тут описание тест и решение

https://vladmihalcea.com/2014/08/29/how-to-customize-hibernate-dirty-checking-mechanism/
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268331
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Тут как вариант пример

http://rsdn.ru/forum/java/4586631.all


Тут описание тест и решение

https://vladmihalcea.com/2014/08/29/how-to-customize-hibernate-dirty-checking-mechanism/
Это как раз следствие open session in view.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268353
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне одному нижеприведенный код кажется немного странным? Раскручивать стек, что бы получить ф-цию откуда мы вызвались.... да еще дергать данный код в каждом сеттере.....

Код: java
1.
        String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268355
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,

Я жду вашего решения с коллекциями ...
)

И да вот пример для чека есть персона два поля имя и возраст.... инстанс Иванов 33.

Вытащили поменяли возраст на 34


вопрос какой запрос на апдейт сгенерит хибер?)

А если 20 полей в перосоне?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268356
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ха... работал с Хибером в Oracle CC&B, там похоже был реализован "Bytecode instrumentation" dirty checking. А я честно говоря думал, что это стандартная фича Hibernate
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268361
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268364
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Во во....я уже тут тему поднимал...но не зашла.... все вокруг думают (или просто мне так кажется) что хибер это очень просто и не нужно знать sql и вообще ничего понимать не нужно ...

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 @Test
    @Commit
    public void showSpecificExecutionOrder() {
        // 1. select client
        Client client = getSession().get(Client.class, 10);
        // 2. select account
        Account account = client.getAccounts().get(0);
        // 3. delete account
        getSession().delete(account);
        // 4. update client
        client.setName("Elvis");
        // 5. insert new report
        Report report = new Report();
        report.setDescription("Client has been updated; Account has been removed");
        getSession().persist(report);
    }




Какие запросы и в какой последовательности будет генерить хибер?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268366
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
Вы удивитесь но сгенерит именно то что вы будете писать руками, тоесть один апдейт. Я писал как у меня сделано. Зато Кроме копипастов из интернетов от вас ничего не было.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268489
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,
Вы удивитесь но сгенерит именно то что вы будете писать руками, тоесть один апдейт. Я писал как у меня сделано. Зато Кроме копипастов из интернетов от вас ничего не было.

Вчера писал с телефона ...вот полный тест с данными :


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<dataset>
    <Client id_client="10" name="John" age="23"/>
    <Client id_client="11" name="Mike" age="28"/>
    <Client id_client="12" name="Kevin" age="19"/>

    <Account id_account="10" amount="50" currency="USD" id_client="10"/>
    <Account id_account="11" amount="100" currency="USD" id_client="10"/>
    <Account id_account="12" amount="150" currency="EUR" id_client="11"/>
    <Account id_account="13" amount="200" currency="EUR" id_client="12"/>
</dataset>




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Getter
@Setter
public class Client implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id_client")
    private Integer id;

    private String name;
    private int age;

    @OneToMany(mappedBy = "client"/*, orphanRemoval = true*/)
    private List<Account> accounts = new ArrayList<>();


    }



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity
@Getter
@Setter
public class Account implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "id_account")
    private Integer id;

    private int amount;
    private String currency;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_client")
    private Client client;

    }




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Entity
@Getter
@Setter
@ToString
public class Report implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer id;

    private String description;
}





Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    @Test
    @Commit
    public void showSpecificExecutionOrder() {
        // 1. select client
        Client client = getSession().get(Client.class, 10);
        // 2. select account
        Account account = client.getAccounts().get(0);
        // 3. delete account
        getSession().delete(account);
        // 4. update client
        client.setName("Elvis");
        // 5. insert new report
        Report report = new Report();
        report.setDescription("Client has been updated; Account has been removed");
        getSession().persist(report);
    }




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Hibernate:  
    insert 
    into
        CLIENT
        (ID_CLIENT, NAME, AGE) 
    values
        (10, 'John', 23) 
Hibernate:  
    insert 
    into
        CLIENT
        (ID_CLIENT, NAME, AGE) 
    values
        (11, 'Mike', 28)
Hibernate:  
    insert 
    into
        CLIENT
        (ID_CLIENT, NAME, AGE) 
    values
        (12, 'Kevin', 19) 
Hibernate:  
    insert 
    into
        ACCOUNT
        (ID_ACCOUNT, AMOUNT, CURRENCY, ID_CLIENT) 
    values
        (10, 50, 'USD', 10) 
Hibernate:  
    insert 
    into
        ACCOUNT
        (ID_ACCOUNT, AMOUNT, CURRENCY, ID_CLIENT) 
    values
        (11, 100, 'USD', 10) 
Hibernate:  
    insert 
    into
        ACCOUNT
        (ID_ACCOUNT, AMOUNT, CURRENCY, ID_CLIENT) 
    values
        (12, 150, 'EUR', 11) {elapsed: 0ms}
Hibernate:  
    insert 
    into
        ACCOUNT
        (ID_ACCOUNT, AMOUNT, CURRENCY, ID_CLIENT) 
    values
        (13, 200, 'EUR', 12) 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
select
        client0_.id_client as id_clien1_1_0_,
        client0_.age as age2_1_0_,
        client0_.name as name3_1_0_ 
    from
        Client client0_ 
    where
        client0_.id_client=10 {elapsed: 135ms}
Hibernate:  
    select
        accounts0_.id_client as id_clien4_0_0_,
        accounts0_.id_account as id_accou1_0_0_,
        accounts0_.id_account as id_accou1_0_1_,
        accounts0_.amount as amount2_0_1_,
        accounts0_.id_client as id_clien4_0_1_,
        accounts0_.currency as currency3_0_1_ 
    from
        Account accounts0_ 
    where
        accounts0_.id_client=10 {elapsed: 2ms}
Hibernate:  
    call next value for hibernate_sequence {elapsed: 3ms}
TRANSACTION BEFORECOMMIT!!!
Hibernate:  
    /* insert com.jeeconf.hibernate.basics.entity.Report
        */ insert 
        into
            Report
            (description, id) 
        values
            ('Client has been updated; Account has been removed', 1) {elapsed: 1ms}
Hibernate:  
    /* update
        com.jeeconf.hibernate.basics.entity.Client */ update
            Client 
        set
            age=23,
            name='Elvis' 
        where
            id_client=10 {elapsed: 1ms}
Hibernate:  
    /* delete com.jeeconf.hibernate.basics.entity.Account */ delete 
        from
            Account 
        where
            id_account=10 {elapsed: 1ms}

TRANSACTION COMPLETE!!!



Не видите ничего странного ?

например что нарушается порядок выполнения кода ?

1)что сначала у вас выполнился insert Report

2)потом update ( причем почему то указаны сразу два поля !!!! age=23, name='Elvis' )

3) и в конце delete Account
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268549
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
По поводу порядка запросов - а какая вам разница-то? Если в этой же транзакции используется помимо хибернейта еще clean jdbc/mybatis например, то перед их вызовом сделать flush/refresh. Про апдейт двух полей - ну не знаю честно говоря почему, но не критично (хотя интересно). А теперь представьте сколько времени вы руками будете это все писать.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268560
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,
По поводу порядка запросов - а какая вам разница-то? Если в этой же транзакции используется помимо хибернейта еще clean jdbc/mybatis например, то перед их вызовом сделать flush/refresh. Про апдейт двух полей - ну не знаю честно говоря почему, но не критично (хотя интересно). А теперь представьте сколько времени вы руками будете это все писать.

Ну как какая разница - она есть .... вы пишете один код - а он делает совсем другое ....

1)Про update - ставите @DynamicUpdate(true) - будет обновлять только одно поле ... но... но ..нужно понимать в каких случаях себе в ногу попадете :) Это решение , почему так - потому что Хибер думает что еще кто то где то мог ваш обхект или его поля изменять и перестраховывается и апдейтит все сразу , даже то что вы не меняли .

Код: java
1.
2.
3.
4.
5.
@Entity
@Getter
@Setter
@DynamicUpdate(true) 
public class Client implements Serializable {




про хибер еще тут
2)
YouTube Video
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268572
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу как какая разница - она есть .... вы пишете один код - а он делает совсем другое ....
Потому что он через кэш сессии работает, а не напрямую с базой. Синхронизация с базой по коммиту, нужно раньше - flush/refresh. Единственно, что на данный момент напрягает это все-таки джойны OneToOne nullable и отсутствие on условия в join fetch...Зато не надо колбасить маппинги на резалтсет, даже в хваленом mybatis, два списка вложенных - полтора экрана маппингов. С ума сойдешь.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268574
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
автор1)Про update - ставите @DynamicUpdate(true) - будет обновлять только одно поле ... но... но ..нужно понимать в каких случаях себе в ногу попадете :) Это решение , почему так - потому что Хибер думает что еще кто то где то мог ваш обхект или его поля изменять и перестраховывается и апдейтит все сразу , даже то что вы не меняли
В JPA нету, это хибернейтовское. Мне кажется если включить кэш 2го уровня, то будет без лишних полей.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268607
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczno56892А что там за dirtychecking если вытаскивать для чтения?
Если вытаскивать в read-only, то dirty checking, как раз не будет.

Тут вопрос к старшим коллегам

можно добиться такого эффекта в Хибернейте путем проставления .setReadOnly(true).

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    @Test
    @Commit
    public void dirtyCheckingDisableForQuery() {
        // add @Immutable to Client
        Client client = getSession().get(Client.class, 1);
        // for queries it is also possible
        getSession().createQuery("select c from Client c").setReadOnly(true).list();
    }



а что делать в JPA и spring-data-repository ?
http://javabeat.net/spring-data-repository-read-only-write-only/

Это будет реальная альтернатива и замена Хибернетй подходу ?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268615
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
Опять куча каких-то "левых" аннотаций не к месту... Оно и так не будет делать dirty checking, т.к. если апдейтов нет - он тупо не нужен.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268623
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Чего там в pure JPA сказать не могу. В Spring можно добиться аналогичного эффекта через @Transactional(readOnly=true).
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268628
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Опять куча каких-то "левых" аннотаций не к месту... Оно и так не будет делать dirty checking, т.к. если апдейтов нет - он тупо не нужен.
Дело не в этом. Если у тебя не read-only сессия, то Hibernate будет создавать прокси для dirty checking, когда они не нужны.
А так же будет хранить слепки оригинального состояния сущности, которые тоже не нужны.
Еще одна важная оптимизачия чтения в ORM это FlushMode. У меня как раз вчера коллеги в NHibernate с этим столкнулись, потому что Spring не используют.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268632
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,
автор1)Про update - ставите @DynamicUpdate(true) - будет обновлять только одно поле ... но... но ..нужно понимать в каких случаях себе в ногу попадете :) Это решение , почему так - потому что Хибер думает что еще кто то где то мог ваш обхект или его поля изменять и перестраховывается и апдейтит все сразу , даже то что вы не меняли
В JPA нету, это хибернейтовское. Мне кажется если включить кэш 2го уровня, то будет без лишних полей.

С чего бы?

вот тест :
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<ehcache>
    <cache name="referenceCache"
           maxElementsInMemory="10000"
           eternal="true"
           timeToIdleSeconds="600"
           timeToLiveSeconds="3600"
           overflowToDisk="false">
    </cache>

    <cache name="org.hibernate.cache.internal.StandardQueryCache"
           maxElementsInMemory="500"
           eternal="false"
           timeToIdleSeconds="600"
           timeToLiveSeconds="3600"/>

    <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
           maxElementsInMemory="50"
           eternal="true"/>
</ehcache>


Код: java
1.
2.
3.
 <dataset>
    <City id_city="1" name="Kiev" country="Ukraine"/>
</dataset>    



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Entity
@Getter
@Setter
@Cacheable
@Cache(region = "referenceCache", usage = CacheConcurrencyStrategy.READ_WRITE)
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id_city")
    private Integer id;

    private String name;
    private String country;
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@DatabaseSetup("/cache.xml")
public class EntityCacheTest extends BaseTest {

    @Test
    @Commit
    public void secondLevelCache() {
        City city = getSession().get(City.class, 1);
        Cache secondLevelCache = getSessionFactory().getCache();
        assertTrue(secondLevelCache.containsEntity(City.class, 1));
        city.setName("Kharkiv");
        //secondLevelCache.evictEntity(City.class, 1);
        getSession().flush();
        getSession().clear(); // clear first level cache
        City cachedCity = getSession().get(City.class, 1);
        System.out.println("");
    }



Вывод :

update
City
set
country='Ukraine',
name='Kharkiv'
where
id_city=1

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Hibernate:  
    insert 
    into
        CITY
        (ID_CITY, NAME, COUNTRY) 
    values
        (1, 'Kiev', 'Ukraine') 


Hibernate:  
    select
        city0_.id_city as id_city1_1_0_,
        city0_.country as country2_1_0_,
        city0_.name as name3_1_0_ 
    from
        City city0_ 
    where
        city0_.id_city=1 {elapsed: 75ms}
Hibernate:  add to batch  
    update
        City 
    set
        country='Ukraine',
        name='Kharkiv' 
    where
        id_city=1 {elapsed: 0ms}
Hibernate:  
    update
        City 
    set
        country='Ukraine',
        name='Kharkiv' 
    where
        id_city=1 {elapsed: 6ms}
Hibernate:  
    select
        city0_.id_city as id_city1_1_0_,
        city0_.country as country2_1_0_,
        city0_.name as name3_1_0_ 
    from
        City city0_ 
    where
        city0_.id_city=1 {elapsed: 0ms}

TRANSACTION BEFORECOMMIT!!!

TRANSACTION COMPLETE!!!
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268635
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

Чего там в pure JPA сказать не могу. В Spring можно добиться аналогичного эффекта через @Transactional(readOnly=true).

Вот я и в сомнениях ...

ибо такое впечатление что просто @Transactional(readOnly=true)

не работает ...

нужно как то так ... @Transactional(readOnly = true , propagation = Propagation.SUPPORTS)


+ еще можно обернуть все в unmodifiableList :)
Код: java
1.
2.
3.
4.
5.
   
 @Transactional(readOnly = true , propagation = Propagation.SUPPORTS)
    public List<Client> findAll() {
        return unmodifiableList(repository.findAll()); 
    }
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268654
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1ибо такое впечатление что просто @Transactional(readOnly=true)

Работает. Но как-то не до конца.
Я смотрю org.springframework.orm.jpa.vendor.HibernateJpaDialect
FlushMode этим атрибутом регулируется.
Но вот где он Session.setDefaultReadOnly() делает - я не вижу такого.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268671
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

В доке сказано что оптимизация имеется

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.repositories It’s definitely reasonable to use transactions for read only queries and we can mark them as such by setting the readOnly flag. This will not, however, act as check that you do not trigger a manipulating query (although some databases reject INSERT and UPDATE statements inside a read only transaction). The readOnly flag instead is propagated as hint to the underlying JDBC driver for performance optimizations. Furthermore, Spring will perform some optimizations on the underlying JPA provider. E.g. when used with Hibernate the flush mode is set to NEVER when you configure a transaction as readOnly which causes Hibernate to skip dirty checks (a noticeable improvement on large object trees).

Но у меня вместо NEVER получается MANUAL, а readonly прилетает через queryParameters
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268744
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892По поводу порядка запросов - а какая вам разница-то?

AFAIK При сложной структуре БД и кучу FK / constraints / triggers - может быть критично
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268748
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Flush
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268808
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕще одна важная оптимизачия чтения в ORM это FlushMode. У меня как раз вчера коллеги в NHibernate с этим столкнулись, потому что Spring не используют.

В свое время Вы мне этим очень помогли !За что огромное спасибо :)

FlushMode это вообще какой-то волшебный атрибут у хибера :)
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268815
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

В доке сказано что оптимизация имеется

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.repositories It’s definitely reasonable to use transactions for read only queries and we can mark them as such by setting the readOnly flag. This will not, however, act as check that you do not trigger a manipulating query (although some databases reject INSERT and UPDATE statements inside a read only transaction). The readOnly flag instead is propagated as hint to the underlying JDBC driver for performance optimizations. Furthermore, Spring will perform some optimizations on the underlying JPA provider. E.g. when used with Hibernate the flush mode is set to NEVER when you configure a transaction as readOnly which causes Hibernate to skip dirty checks (a noticeable improvement on large object trees).

Но у меня вместо NEVER получается MANUAL, а readonly прилетает через queryParameters

тут вот так же есть описание поведения readOnly на JDBC
http://www.ibm.com/developerworks/ru/library/j-ts1/
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268835
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1тут вот так же есть описание поведения readOnly на JDBC
http://www.ibm.com/developerworks/ru/library/j-ts1/
Это уже зависит от драйвера и БД. Но Spring Data пытается и у конекшна этот флаг установить.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268874
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1тут вот так же есть описание поведения readOnly на JDBC
http://www.ibm.com/developerworks/ru/library/j-ts1/
сам сказал, что в ОРМ полно подводных камней.
А введением флага "только чтение" ты ещё добавил второй миллион багов и особенностей выполнения на разных БД.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268876
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
это на тебя тот паттерн так повлиял?
Первый паттерн - "взял и работай". Ничего не трогая и не переключая.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269036
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Atum1,
это на тебя тот паттерн так повлиял?
Первый паттерн - "взял и работай". Ничего не трогая и не переключая.

@Transactional(readOnly=true) - Это простой спринговый аспект (ну хочется в это верить:) )

так что его код можно взять и посомтреть

https://github.com/spring-projects/spring-framework/blob/master/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java

ну или какую то реализацию ...

грубо говоря это равносильно тому что мы метод обернули


в исполнение сами - мы же можем ввести свою транзакцию :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   
      PlatformTransactionManager;
      DefaultTransactionDefinition;
      TransactionStatus;
....
 public void aopSqlCommand(){
      
try{
      begin(...);//  начали транзакцию 
        // вызвали метод  -> выполнили SQL 
      commit(...); // закочили
      
      } catch (DataAccessException e) {
         rollback(...);
         throw e;
      }
   
   }



но в декларативном стиле @Transactional(readOnly=true) - лучше смотрится ...
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269052
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Это простой спринговый аспект (ну хочется в это верить:) )
я не против.
Только что он сделает в моём примере с Ораклом?
Там нет читающих транзакций.
Коннект может делать что угодно если есть права в БД.
Поэтому я не понял всей этой бодяги.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269100
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1в исполнение сами - мы же можем ввести свою транзакцию :

Угу, только в ручной транзакции мы
- Не сказали коннекшну быть readOnly
- Не поменяли FlushMode, что скорее всего приведет к потере производительности
- Не сказали хибернейтовской сессии отключить dirty check proxy и snapshot-ы
- Никак не учитываем внешню транзакцию, если она уже открыта
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269105
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1в исполнение сами - мы же можем ввести свою транзакцию :

Угу, только в ручной транзакции мы
- Не сказали коннекшну быть readOnly
- Не поменяли FlushMode, что скорее всего приведет к потере производительности
- Не сказали хибернейтовской сессии отключить dirty check proxy и snapshot-ы
- Никак не учитываем внешню транзакцию, если она уже открыта

ну тут уже можно все эти параметры накрутить в виде атрибутов , что собственно в спринге и делается ?!

Petro123 ,
С Ораклом нужно смотреть как это реализовано у спринга и хибернейта .

Думаю есть какое то решение.

Через спринг и хибернейт я работаю с mysql .
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269106
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269109
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются.
Не мерял как там dirty check на производительность влияет, а вот смену FlushMode на производительности видно невооруженным глазом. Так что не надо трындеть. Читайте внимательнее что пишут. Иначе флаш после каждого запроса даст вашему серверу просраться как следует.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269112
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1С Ораклом нужно смотреть как это реализовано у спринга и хибернейта .
Думаю есть какое то решение.
Через спринг и хибернейт я работаю с mysql .
нууууу. Это неинтересно)).
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269129
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczno56892Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются.
Не мерял как там dirty check на производительность влияет, а вот смену FlushMode на производительности видно невооруженным глазом. Так что не надо трындеть. Читайте внимательнее что пишут. Иначе флаш после каждого запроса даст вашему серверу просраться как следует.
Причем здесь FlushMode и readonly?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269140
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Причем здесь FlushMode и readonly?
При тому что Spring умеет говорить JPA использовать FlushMode.MANUAL/NEVER когда стоит флаг readOnly.
В противном случае, если у вас будет одна сессия на кучу запросов, вы получите флаш на каждый заспрос с офигенным проседанием производительности.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39441826
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczno56892Причем здесь FlushMode и readonly?
При тому что Spring умеет говорить JPA использовать FlushMode.MANUAL/NEVER когда стоит флаг readOnly.
NEVER уже минимум как пару лет задеприйкейтнута
Deprecated. Use MANUAL instead. This was the original name given to manual flushing, but it was misleading users into thinking that the Session won’t ever be flushed
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39441833
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаNEVER уже минимум как пару лет задеприйкейтнута
Deprecated. Use MANUAL instead. This was the original name given to manual flushing, but it was misleading users into thinking that the Session won’t ever be flushed
Какой ценный комментарий.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39441852
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
А что, тут что-то обидное для вас?
вообще-то это я в ответ на "Но у меня вместо NEVER получается MANUAL" настучал, машинально вышло на последнее сообщение.
Я уже пару лет вывалился из мейнстрима (попал в тупиковую ветку развития), сейчас восстанавливаю навыки. Вот смотрю еще на MyBatis.
Мне его подход кажется более правильным ( в ADF сделано аналогично - на натуральные запросы наворачивается объектная оболочка).
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39442007
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаВот смотрю еще на MyBatis.
Мне его подход кажется более правильным ( в ADF сделано аналогично - на натуральные запросы наворачивается объектная оболочка).
QueryDSL и jOOQ посмотрите.
...
Рейтинг: 0 / 0
79 сообщений из 79, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA много @OneToOne
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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