|
|
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
В ентити очень много @OneToOne и @ManyToOne, хибернейт делает join с ними даже когда они не нужны. FetchLazy не помогает. Какой самый простой способ это решить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 13:49 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892, FetchLazy не помогает, если ORM не может создать прокси на сущность. А прокси ORM не может создать, когда нет интерфейсов для сущностей, нет нужных либ в classpath для создания прокси без интерфейсов или такая фича отключена вовсе. О каком провайдере речь? Хибер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:09 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Да, а что мне надо добавить в classpath? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:11 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Blazkowicz, Да, а что мне надо добавить в classpath? javassist вроде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:12 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
В логах он вроде его и использует: : HHH000021: Bytecode provider name : javassist А после получения энтити никаких прокси там нет почему-то - обычные pojo. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:38 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Тогда странно. ManyToOne должен был работать. Для OneToOne могут быть ещё ограничения http://stackoverflow.com/questions/1444227/making-a-onetoone-relation-lazy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:54 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Да, с optional false заработало @OneToOne. Спасибо огромное! PS А что делать если нужен null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:04 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Blazkowicz, Да, с optional false заработало @OneToOne. Спасибо огромное! PS А что делать если нужен null? Для nullable one-to-one ассоциаций в принципе нельзя оптимизировать через ленивую загрузку, потому что единственный способ узнать null у нас или ленивое значение это сделать выборку из обоих таблиц. И при этом смысл в ленивости отпадает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:07 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892В ентити очень много @OneToOne и @ManyToOne, хибернейт делает join с ними даже когда они не нужны. FetchLazy не помогает. Какой самый простой способ это решить? Самый простой - вытаскивать DTO только то что вам нужно ... пишите тесты смотрите какие запросы строятся - благо тесты очень легковесные и простые https://github.com/xpinjection/hibernate-performance/tree/master/src/test/java/com/jeeconf/hibernate/performancetuning/readonly переосмыслить вашу модель еще раз . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 10:35 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, Это как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:54 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Atum1, Это как? авторВ ентити очень много @OneToOne Это как ? Решение : вытаскивать только то что вам нужно в ридонли моде и в виде DTO чтобы не тянуть все эти @OneToOne - если у вас там дерево , как вариант к примеру сотрудников - то обычный рабочий рискует вытащить всех своих руководителей ...а те в свою очередь все необходимые им @OneToOne объекты ... в итоге имеет n+1 запрос но наоборот :) итд ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 14:03 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, Так это ж ридонли + еще нужно dto городить параллельно энтити классам, а если вам нужны OneToMany там? Вручную резалтсет парсить? И это еще и без обновлений... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 14:08 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Atum1, Так это ж ридонли + еще нужно dto городить параллельно энтити классам, а если вам нужны OneToMany там? Вручную резалтсет парсить? И это еще и без обновлений... Опишите вашу модель и алгоритм работы с ней ... ?! что она из себя представляет. ИМХО идеально использовать entity только для операций сохранения(вставки объектов в БД) , все остальные операции (выборки из базы, особенно в вашей объектной модели ) - очень жесткий удар по перфомансу. И не нужно городить - используйте только dto и тащите ТОЛЬКО все что вам нужно . Используйте паттерн CQRS место Repository . Писать в стиле CQRS для JPA это и есть серебряная пуля этой технологии :) поверьте . Ибо Ваша модель entity классов - это коде ферст если вы ведете разработку через нее - нужна только для генерации базы данных , простановки констрейтов и индексов ... Использовать эти объекты в других слоях и их тем более отдавать их сразу клиенту или на view это преступление . Вы небось и OpenSessionInViewFilter используете ? Примите за правило что писать запросы все равно нужно и , поверье они будут на два порядка эффективнее чем то , через что вы будете работать если сконфигурируете свою модель через entity... К тому же у вас каждый раз используя DTO развязаны руки в определении equals hashcode contract возьмите себе немного времени и подумайте об этом . Не нужно поддаваться искушению - я ничего не буду писать - лишь опишу свою объектную модель, а ORM все будет делать за меня ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 14:56 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Atum1, если вам нужны OneToMany там? Вручную резалтсет парсить? И это еще и без обновлений... так же скинул я пример кода . если нужны пишете запрос на fetch join - других вариантов нет . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 14:57 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1 equals hashcode contract + toString() как вы будите писать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 15:08 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1Используйте паттерн CQRS место Repository . эк тебя качнуло в совершенно другую ипостась. Еретик)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 15:33 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Petro123Atum1Используйте паттерн CQRS место Repository . эк тебя качнуло в совершенно другую ипостась. Еретик)). :) а какие варианты ? тем более когда у него OneToOne ? он же указав везде FetchLazy - посто будет получать ошибку инициализации на каком то другой уровне - ближе к клиенту ... или не будет ,если у него под рукой есть сессия :) что тоже черевато :) ps в самом простом варианте для OneToOne CQRS - это когда много маленьких запросов - классов вместо одного большого "волшебного " Repository . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 18:07 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. что дает вам один универсальный метод для всего :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 18:14 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, Круто! А можешь показать, как ты вытащишь хотя-бы два вложенных списка без хибера?))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 18:23 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
авторон же указав везде FetchLazy - посто будет получать ошибку инициализации на каком то другой уровне - ближе к клиенту ... или не будет ,если у него под рукой есть сессия :) Для этого есть join fetch, правда столкнулся с тем что нельзя указать доп условие в on, через where не получится, пришлось с другой стороны графа вытаскивать. авторИспользовать эти объекты в других слоях и их тем более отдавать их сразу клиенту или на view это преступление Энтити это обычные pojo, какая разница. В чем преступление то? авторПримите за правило что писать запросы все равно нужно и , поверье они будут на два порядка эффективнее чем то , через что вы будете работать если сконфигурируете свою модель через entity... Откуда такие цифры? авторК тому же у вас каждый раз используя DTO развязаны руки в определении equals hashcode contract Они и так развязаны. авторВаша модель entity классов - это коде ферст если вы ведете разработку через нее - нужна только для генерации базы данных , простановки констрейтов и индексов ... Жееесть! Все, жду парсинг резалтсета с 2мя списками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 18:31 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
авторCQRS - это когда много маленьких запросов - классов вместо одного большого "волшебного " Repository . Ушли от n+1 и к чему пришли оказывается... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 18:37 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1CQRS - это когда я просто не увидел там что то крутого. Этой технологии ведь уже лет 8? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 22:20 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892авторCQRS - это когда много маленьких запросов - классов вместо одного большого "волшебного " Repository . Ушли от n+1 и к чему пришли оказывается... почему? будет 1 запрос .... а не n+1 / если n+1 классов - то да . будет много маленьких классов ... Это как присать plsql процедуры - под каждый чих свой plsql -процедурку - типа АПИ к БД на прроцедурах. n+1 класс с запросами проще тестировать через TDD :) а один большой Repository - это попахивает Антипаттерном "Волшебный сервлет" Petro123Atum1CQRS - это когда я просто не увидел там что то крутого. Этой технологии ведь уже лет 8? наверное мы по разному видим и понимаем CQRS :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:16 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Atum1, Круто! А можешь показать, как ты вытащишь хотя-бы два вложенных списка без хибера?))) А можно для начала модель вашу и как вы это делаете ? и тестик :) и количество sql запросов которые генерит хибер :)? ps как буду делать ( тут все зависит от тех данных что у вас и их количества , может у вас там коллекции по 10 млн обхектов): а так ну либо обычным Jpql | hql | критерия апи | нативным sql | entitygraph кстати entitygraph - настоятельно рекомендую для вашего решения :) jpa 2.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:19 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Atum1, Круто! А можешь показать, как ты вытащишь хотя-бы два вложенных списка без хибера?))) такое решение вас устроит ? Код: java 1. 2. 3. 4. 5. 6. 7. Код: java 1. 2. 3. 4. 5. 6. 7. 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 конеекта к БД бесплатные ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:31 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1наверное мы по разному видим и понимаем CQRS :) возможно. Но: - оракл не делит транзакции на читающие и пишущие. Зачем мне тогда это? - не понял про необходимость устройства доп.БД _читающей_. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 15:45 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
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 если вытаскивать для чтения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 16:44 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892А что там за dirtychecking если вытаскивать для чтения? Если вытаскивать в read-only, то dirty checking, как раз не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 17:10 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Petro123Atum1наверное мы по разному видим и понимаем CQRS :) возможно. Но: - оракл не делит транзакции на читающие и пишущие. Зачем мне тогда это? - не понял про необходимость устройства доп.БД _читающей_. IMHO Папа все понял... ну это уж совсем классическое описание паттерна.... я же говорил про его идею и маленькую часть.... А так да Там же и cap теорема всплывает и пр.пр... Нужно Писать классы запросы на dsl языке и исполнять их .... как у с# есть linq язык..... Прада на java реализации счас очень стремная) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:12 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Blazkowiczno56892А что там за dirtychecking если вытаскивать для чтения? Если вытаскивать в read-only, то dirty checking, как раз не будет. Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:13 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
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 класс описать там же есть пример . Вы теперь свое чудо решение покажите !? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:31 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто. В том плане что недостаточно указать просто транзакцию как ридонли .... нужно обязательно указать флаг ридонли в true. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:33 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1Если вытаскивать dto то не будет.... для ридонли там еще нужно посмотреть .... не так все просто. В том плане что недостаточно указать просто транзакцию как ридонли .... нужно обязательно указать флаг ридонли в true. А Либо через StatelessSession тянуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:36 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Может я конечно туплю, но "dirty checking" - что Вы под этими словами подразумеваете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:36 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, Или добавить @Immutable над классом) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:38 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, То что сам производитель и создатель хибернейта... плюс это куча абстракций...куча оберток... куча проксей и конечно же кеш... что очень улучшает вашу жизнь и делает оцбой ваш запрос на порядок а то и два медленнее) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:48 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Вот наверное самое простое описание для другого фреймворка ,но и для хибера подходит Dirty checking По этому принципу работает AngularJS. Dirty checking — это проверка на изменененность данных, простая как два рубля. Раньше переменная myVar была 1, теперь она 2 — значит данные изменились и надо их в шаблоне перерисовать. Для простых переменных это оператор !=, для сложных — соответствующие легковесные процедуры. Это простейший подход, который избавляет нас как от необходимости работать с данными через специальный «слушающий» слой, так и от всех проблем, связанных с зависимостями данных. Что в свою очередь ведёт нас к вопросу равенства двух объектов на уровне jvm и на уровне базы данных ..... я уже спрашивал по этому поводу автора как он пишет хешкод и иквалс и тостринг.... но ответа не было.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 19:52 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, Мда смешались в кучу люди кони, имххо у вас какая то каша в голове. Дирти чек это когда передаешь ентити весь граф на мердж, и оно там ищет какие объекты поменялись чтобы сгенить апдейт инсерт делает. Иквалс хэшкод по айдишнику.ту стринг нафиг не нужен. Выборка через джипикуэл. Да кстати я просил два вложенных списка)) видимо задачки для собеседования пошли во вред)) без обид ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 20:02 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Тут как вариант пример http://rsdn.ru/forum/java/4586631.all Тут описание тест и решение https://vladmihalcea.com/2014/08/29/how-to-customize-hibernate-dirty-checking-mechanism/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 20:08 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 20:42 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Мне одному нижеприведенный код кажется немного странным? Раскручивать стек, что бы получить ф-цию откуда мы вызвались.... да еще дергать данный код в каждом сеттере..... Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 21:51 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892, Я жду вашего решения с коллекциями ... ) И да вот пример для чека есть персона два поля имя и возраст.... инстанс Иванов 33. Вытащили поменяли возраст на 34 вопрос какой запрос на апдейт сгенерит хибер?) А если 20 полей в перосоне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 22:04 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Ха... работал с Хибером в Oracle CC&B, там похоже был реализован "Bytecode instrumentation" dirty checking. А я честно говоря думал, что это стандартная фича Hibernate ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 22:06 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Во во....я уже тут тему поднимал...но не зашла.... все вокруг думают (или просто мне так кажется) что хибер это очень просто и не нужно знать sql и вообще ничего понимать не нужно ... Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Какие запросы и в какой последовательности будет генерить хибер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 22:37 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, Вы удивитесь но сгенерит именно то что вы будете писать руками, тоесть один апдейт. Я писал как у меня сделано. Зато Кроме копипастов из интернетов от вас ничего не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 22:42 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Atum1, Вы удивитесь но сгенерит именно то что вы будете писать руками, тоесть один апдейт. Я писал как у меня сделано. Зато Кроме копипастов из интернетов от вас ничего не было. Вчера писал с телефона ...вот полный тест с данными : Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: 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. Код: 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. Не видите ничего странного ? например что нарушается порядок выполнения кода ? 1)что сначала у вас выполнился insert Report 2)потом update ( причем почему то указаны сразу два поля !!!! age=23, name='Elvis' ) 3) и в конце delete Account ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 09:12 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, По поводу порядка запросов - а какая вам разница-то? Если в этой же транзакции используется помимо хибернейта еще clean jdbc/mybatis например, то перед их вызовом сделать flush/refresh. Про апдейт двух полей - ну не знаю честно говоря почему, но не критично (хотя интересно). А теперь представьте сколько времени вы руками будете это все писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 10:31 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Atum1, По поводу порядка запросов - а какая вам разница-то? Если в этой же транзакции используется помимо хибернейта еще clean jdbc/mybatis например, то перед их вызовом сделать flush/refresh. Про апдейт двух полей - ну не знаю честно говоря почему, но не критично (хотя интересно). А теперь представьте сколько времени вы руками будете это все писать. Ну как какая разница - она есть .... вы пишете один код - а он делает совсем другое .... 1)Про update - ставите @DynamicUpdate(true) - будет обновлять только одно поле ... но... но ..нужно понимать в каких случаях себе в ногу попадете :) Это решение , почему так - потому что Хибер думает что еще кто то где то мог ваш обхект или его поля изменять и перестраховывается и апдейтит все сразу , даже то что вы не меняли . Код: java 1. 2. 3. 4. 5. про хибер еще тут 2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 10:51 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
авторНу как какая разница - она есть .... вы пишете один код - а он делает совсем другое .... Потому что он через кэш сессии работает, а не напрямую с базой. Синхронизация с базой по коммиту, нужно раньше - flush/refresh. Единственно, что на данный момент напрягает это все-таки джойны OneToOne nullable и отсутствие on условия в join fetch...Зато не надо колбасить маппинги на резалтсет, даже в хваленом mybatis, два списка вложенных - полтора экрана маппингов. С ума сойдешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 10:59 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, автор1)Про update - ставите @DynamicUpdate(true) - будет обновлять только одно поле ... но... но ..нужно понимать в каких случаях себе в ногу попадете :) Это решение , почему так - потому что Хибер думает что еще кто то где то мог ваш обхект или его поля изменять и перестраховывается и апдейтит все сразу , даже то что вы не меняли В JPA нету, это хибернейтовское. Мне кажется если включить кэш 2го уровня, то будет без лишних полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 11:01 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Blazkowiczno56892А что там за dirtychecking если вытаскивать для чтения? Если вытаскивать в read-only, то dirty checking, как раз не будет. Тут вопрос к старшим коллегам можно добиться такого эффекта в Хибернейте путем проставления .setReadOnly(true). Код: java 1. 2. 3. 4. 5. 6. 7. 8. а что делать в JPA и spring-data-repository ? http://javabeat.net/spring-data-repository-read-only-write-only/ Это будет реальная альтернатива и замена Хибернетй подходу ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 11:18 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, Опять куча каких-то "левых" аннотаций не к месту... Оно и так не будет делать dirty checking, т.к. если апдейтов нет - он тупо не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 11:25 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, Чего там в pure JPA сказать не могу. В Spring можно добиться аналогичного эффекта через @Transactional(readOnly=true). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 11:31 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Опять куча каких-то "левых" аннотаций не к месту... Оно и так не будет делать dirty checking, т.к. если апдейтов нет - он тупо не нужен. Дело не в этом. Если у тебя не read-only сессия, то Hibernate будет создавать прокси для dirty checking, когда они не нужны. А так же будет хранить слепки оригинального состояния сущности, которые тоже не нужны. Еще одна важная оптимизачия чтения в ORM это FlushMode. У меня как раз вчера коллеги в NHibernate с этим столкнулись, потому что Spring не используют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 11:35 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
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. Код: java 1. 2. 3. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Вывод : 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 11:39 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAtum1, Чего там в pure JPA сказать не могу. В Spring можно добиться аналогичного эффекта через @Transactional(readOnly=true). Вот я и в сомнениях ... ибо такое впечатление что просто @Transactional(readOnly=true) не работает ... нужно как то так ... @Transactional(readOnly = true , propagation = Propagation.SUPPORTS) + еще можно обернуть все в unmodifiableList :) Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 11:44 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1ибо такое впечатление что просто @Transactional(readOnly=true) Работает. Но как-то не до конца. Я смотрю org.springframework.orm.jpa.vendor.HibernateJpaDialect FlushMode этим атрибутом регулируется. Но вот где он Session.setDefaultReadOnly() делает - я не вижу такого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 11:56 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 12:10 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892По поводу порядка запросов - а какая вам разница-то? AFAIK При сложной структуре БД и кучу FK / constraints / triggers - может быть критично ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 12:58 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Flush ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 13:00 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕще одна важная оптимизачия чтения в ORM это FlushMode. У меня как раз вчера коллеги в NHibernate с этим столкнулись, потому что Spring не используют. В свое время Вы мне этим очень помогли !За что огромное спасибо :) FlushMode это вообще какой-то волшебный атрибут у хибера :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 13:40 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
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/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 13:43 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1тут вот так же есть описание поведения readOnly на JDBC http://www.ibm.com/developerworks/ru/library/j-ts1/ Это уже зависит от драйвера и БД. Но Spring Data пытается и у конекшна этот флаг установить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 13:54 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1тут вот так же есть описание поведения readOnly на JDBC http://www.ibm.com/developerworks/ru/library/j-ts1/ сам сказал, что в ОРМ полно подводных камней. А введением флага "только чтение" ты ещё добавил второй миллион багов и особенностей выполнения на разных БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 14:19 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1, это на тебя тот паттерн так повлиял? Первый паттерн - "взял и работай". Ничего не трогая и не переключая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 14:20 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
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. но в декларативном стиле @Transactional(readOnly=true) - лучше смотрится ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 15:56 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1Это простой спринговый аспект (ну хочется в это верить:) ) я не против. Только что он сделает в моём примере с Ораклом? Там нет читающих транзакций. Коннект может делать что угодно если есть права в БД. Поэтому я не понял всей этой бодяги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 16:04 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1в исполнение сами - мы же можем ввести свою транзакцию : Угу, только в ручной транзакции мы - Не сказали коннекшну быть readOnly - Не поменяли FlushMode, что скорее всего приведет к потере производительности - Не сказали хибернейтовской сессии отключить dirty check proxy и snapshot-ы - Никак не учитываем внешню транзакцию, если она уже открыта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 16:42 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAtum1в исполнение сами - мы же можем ввести свою транзакцию : Угу, только в ручной транзакции мы - Не сказали коннекшну быть readOnly - Не поменяли FlushMode, что скорее всего приведет к потере производительности - Не сказали хибернейтовской сессии отключить dirty check proxy и snapshot-ы - Никак не учитываем внешню транзакцию, если она уже открыта ну тут уже можно все эти параметры накрутить в виде атрибутов , что собственно в спринге и делается ?! Petro123 , С Ораклом нужно смотреть как это реализовано у спринга и хибернейта . Думаю есть какое то решение. Через спринг и хибернейт я работаю с mysql . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 16:45 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 16:45 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются. Не мерял как там dirty check на производительность влияет, а вот смену FlushMode на производительности видно невооруженным глазом. Так что не надо трындеть. Читайте внимательнее что пишут. Иначе флаш после каждого запроса даст вашему серверу просраться как следует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 16:48 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Atum1С Ораклом нужно смотреть как это реализовано у спринга и хибернейта . Думаю есть какое то решение. Через спринг и хибернейт я работаю с mysql . нууууу. Это неинтересно)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 16:50 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Blazkowiczno56892Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются. Не мерял как там dirty check на производительность влияет, а вот смену FlushMode на производительности видно невооруженным глазом. Так что не надо трындеть. Читайте внимательнее что пишут. Иначе флаш после каждого запроса даст вашему серверу просраться как следует. Причем здесь FlushMode и readonly? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 17:03 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
no56892Причем здесь FlushMode и readonly? При тому что Spring умеет говорить JPA использовать FlushMode.MANUAL/NEVER когда стоит флаг readOnly. В противном случае, если у вас будет одна сессия на кучу запросов, вы получите флаш на каждый заспрос с офигенным проседанием производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 17:14 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 18:01 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Пылинка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 Какой ценный комментарий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 18:09 |
|
||
|
JPA много @OneToOne
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, А что, тут что-то обидное для вас? вообще-то это я в ответ на "Но у меня вместо NEVER получается MANUAL" настучал, машинально вышло на последнее сообщение. Я уже пару лет вывалился из мейнстрима (попал в тупиковую ветку развития), сейчас восстанавливаю навыки. Вот смотрю еще на MyBatis. Мне его подход кажется более правильным ( в ADF сделано аналогично - на натуральные запросы наворачивается объектная оболочка). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 18:54 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2122962]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
129ms |
get tp. blocked users: |
2ms |
| others: | 224ms |
| total: | 472ms |

| 0 / 0 |
