|
скала слик
|
|||
---|---|---|---|
#18+
maytonandreykaTпроблема нативскуэля в том что если у тебя доменная модель поменяется допустим, ты банально увидишь что у тебя что то сломалось только когда тестами гонять будешь. если они вообще у тебя будут и будут покрывать этот кейс. поэтому хотелось бы оставить дсл. Выкрутился Я вообще в ужасе - как же живут чисто sql-программисты, типа на PL/SQL, и не тужат. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 22:04 |
|
скала слик
|
|||
---|---|---|---|
#18+
maytonНе знаю что это. Но этот код ужасен. Вопрос привычки. 12 строк кода на 6 джойнов, по-моему очень даже неплохо. Вот пример джойна на хаскел Код: java 1. 2. 3. 4. 5.
После 15 лет на джаве может показаться мозголомным, кому-то элегантным ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 23:41 |
|
скала слик
|
|||
---|---|---|---|
#18+
Андрей ПанфиловandreykaTюзай проекции. они тебя спасут. если тебе не нравится что хибер что-то лишнее на твой взгляд вытягивает. Ничем оно не поможет. Вот сущность: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
а почему тут работать не будет? Я думал проблемы с onetoone ? там FetchType.LAZY работать никогда не будет, потому что так устроен хибернейт. Предлагаю дальше тему не развивать, поскольку примеров масса и хибернейт - это УГ, факт. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 08:43 |
|
скала слик
|
|||
---|---|---|---|
#18+
а почему тут работать не будет? Я думал проблемы с onetoone ? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 09:35 |
|
скала слик
|
|||
---|---|---|---|
#18+
Пылинкаmaytonпропущено... Выкрутился Я вообще в ужасе - как же живут чисто sql-программисты, типа на PL/SQL, и не тужат. Если меняется доменная модель то процедуры, вьюшки и прочие объекты домена БД переходят в invalid state. Далее - задача PLSQL разработчика - просто просмотреть список объектов и по каждому принять решение. Но поскольку Java ORM создавались в отрыве от конкретной БД то такой функционал им недоступен. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 10:40 |
|
скала слик
|
|||
---|---|---|---|
#18+
mayton, Это в оракле. В остальных вроде этого нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 10:46 |
|
скала слик
|
|||
---|---|---|---|
#18+
Озверина почему тут работать не будет? Я думал проблемы с onetoone ?ну OneToOne - известная грабля, решается обещанием что запись есть при помощи optional=false, однако, lazy в ManyToOne/OneToOne с натуральным ключем при наличии суррогатного не умеет, ну просто потому что в сессии сущности только по одному ключу доступны: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/type/EntityType.java#L461 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 11:26 |
|
скала слик
|
|||
---|---|---|---|
#18+
Андрей ПанфиловOneToOneтакое отношение и бд разрабы не любят. Неудивительно что грабли. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 11:28 |
|
скала слик
|
|||
---|---|---|---|
#18+
maytonПылинкапропущено... Я вообще в ужасе - как же живут чисто sql-программисты, типа на PL/SQL, и не тужат. Если меняется доменная модель то процедуры, вьюшки и прочие объекты домена БД переходят в invalid state. Далее - задача PLSQL разработчика - просто просмотреть список объектов и по каждому принять решение. Но поскольку Java ORM создавались в отрыве от конкретной БД то такой функционал им недоступен. это что такое - в отрыве от конкретной БД ? Ничего не понял. 1) объекты БД точно так же перейдут (или не перейдут) в это состояние. 2) если вам нужны сущности ORM - то у вас что, не работает поиск объявления и использования классов JAVA? Точно так же получите весь список. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 12:05 |
|
скала слик
|
|||
---|---|---|---|
#18+
Андрей ПанфиловОзверина почему тут работать не будет? Я думал проблемы с onetoone ?ну OneToOne - известная грабля, решается обещанием что запись есть при помощи optional=false, однако, lazy в ManyToOne/OneToOne с натуральным ключем при наличии суррогатного не умеет, ну просто потому что в сессии сущности только по одному ключу доступны: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/type/EntityType.java#L461 а потом меня спрашивают, почему я могу предпочесть запросы сущностям со связями. Я так понимаю, был какой-то выход, но даже этот выход хибернейтовсцы умудрились сломать: https://stackoverflow.com/questions/30082281/manytoonefetch-fetchtype-lazy-doesnt-work-on-non-primary-key-referenced-co https://hibernate.atlassian.net/browse/HHH-12053 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 12:27 |
|
скала слик
|
|||
---|---|---|---|
#18+
Озверина потом меня спрашивают, почему я могу предпочесть запросы сущностям со связями.Ну это только одна из проблем, а там их горы, вот примеры: захотел в старом хибере чтобы он мне Stream возвращал вместо списка, начал смотреть как реализовали в новом: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/query/internal/ScrollableResultsIterator.java - збс, в итераторе вызов hasNext() курсор двигает сколько угодно раз захотели блокировки в нужных местах делать, вроде паттерн стандартный: блокируем запись по id, потом обновляем сущность из БД, а вот нельзя так если в сущности есть @Version-поле - это поделие зачем-то в запрос условие на штамп версии вставляет: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/lock/PessimisticWriteSelectLockingStrategy.java#L111 ну и в общем так постоянно: чуть в сторону от элементарных вещей и сразу грабли на ровном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 12:42 |
|
скала слик
|
|||
---|---|---|---|
#18+
Пылинкаmaytonпропущено... Если меняется доменная модель то процедуры, вьюшки и прочие объекты домена БД переходят в invalid state. Далее - задача PLSQL разработчика - просто просмотреть список объектов и по каждому принять решение. Но поскольку Java ORM создавались в отрыве от конкретной БД то такой функционал им недоступен. это что такое - в отрыве от конкретной БД ? Ничего не понял. 1) объекты БД точно так же перейдут (или не перейдут) в это состояние. 2) если вам нужны сущности ORM - то у вас что, не работает поиск объявления и использования классов JAVA? Точно так же получите весь список. 1) Я не буду писать много букв. Много лет назад были выпущены статьи на тему недостатков ORM. Вкратце оно называется object relational impedance mismatch . Поищите. 2) Мой комментарий касался отзывчивости среды разработки БД к изменениям (например удалена колонка из таблицы). И неотзывчивости ORM-средств которые детектируют это изменние только в фазе непосредственного выполнения. Даже не в компилляции. Тоже самое кажется спрашивал и мой собеседник. Его беспокоила скорость реакции системы на изменения. Ну ... я так это понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 13:56 |
|
скала слик
|
|||
---|---|---|---|
#18+
Андрей Панфиловзахотели блокировки в нужных местах делать, вроде паттерн стандартный: блокируем запись по id, потом обновляем сущность из БД, а вот нельзя так если в сущности есть @Version-поле - это поделие зачем-то в запрос условие на штамп версии вставляет: Зачем блокировать пессимистически, если там автоматом оптимистическая блокировка встроена? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 18:56 |
|
скала слик
|
|||
---|---|---|---|
#18+
ПылинкаАндрей Панфиловзахотели блокировки в нужных местах делать, вроде паттерн стандартный: блокируем запись по id, потом обновляем сущность из БД, а вот нельзя так если в сущности есть @Version-поле - это поделие зачем-то в запрос условие на штамп версии вставляет: Зачем блокировать пессимистически, если там автоматом оптимистическая блокировка встроена? А с каких пор оптимистическая стала рекомендованным шаблоном? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 19:04 |
|
скала слик
|
|||
---|---|---|---|
#18+
Озверина потом меня спрашивают, почему я могу предпочесть запросы сущностям со связями. Я так понимаю, был какой-то выход, но даже этот выход хибернейтовсцы умудрились сломать: "Мы" уже давно пришли к выводу что такие связи в ORM - зло. Аналог их встроен в ADF, у нас был "корпоротивный стандарт" (длительный опыт) - никак связи не использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 19:05 |
|
скала слик
|
|||
---|---|---|---|
#18+
maytonА с каких пор оптимистическая стала рекомендованным шаблоном? А с какого там тогда Version поле? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 19:06 |
|
скала слик
|
|||
---|---|---|---|
#18+
ПылинкаmaytonА с каких пор оптимистическая стала рекомендованным шаблоном? А с какого там тогда Version поле? А я ничего вообще не говорил про Version. Интересный у нас разговор получается. Может нам стоит вернуться в начало? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 19:11 |
|
скала слик
|
|||
---|---|---|---|
#18+
mayton, Пылинка имеет ввиду, что использовать одновременно и поле Version и пессимистичную блокировку немного бессмысленно. Тут или трусы или крестик ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 20:20 |
|
скала слик
|
|||
---|---|---|---|
#18+
ПылинкаЗачем блокировать пессимистически, если там автоматом оптимистическая блокировка встроена?не автоматом, а костылем. Оптимистичная блокировка полезна в довольно ограниченных случаях, а именно когда пользователь пытается сохранить строку, а мы его отшиваем и говорим: тут пока ты думал что-то поменялось, иди и разбирайся сам что произошло, в остальных случаях пользы от нее никакой: ну на кой черт нам что-то обрабатывать, а потом в коммите словить ошибку, что не получилось? мы же наверняка знаем что будем менять, поэтому на порядок проще заблокировать то что нужно, а потом уже обновлять. С хиберовским же подходом, получается так, что он пуляет кривой select for update в базу, не получает результата и кидает StaleObjectStateException, от которого толку вообще никакого нет, вот что с ним делать? Ловить в цикле пока не пропадет? а как понять что вообще случилось? Ситуация что строчки в базе нет может быть вызвана по крайней мере тремя причинами, нам еще каждую гипотезу проверять и тоже перехватывать исключения? Вот на ровном месте получается куча стремного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 20:23 |
|
скала слик
|
|||
---|---|---|---|
#18+
Андрей ПанфиловПылинкаЗачем блокировать пессимистически, если там автоматом оптимистическая блокировка встроена?не автоматом, а костылем. Оптимистичная блокировка полезна в довольно ограниченных случаях, а именно когда пользователь пытается сохранить строку, а мы его отшиваем и говорим: тут пока ты думал что-то поменялось, иди и разбирайся сам что произошло, в остальных случаях пользы от нее никакой: ну на кой черт нам что-то обрабатывать, а потом в коммите словить ошибку, что не получилось? мы же наверняка знаем что будем менять, поэтому на порядок проще заблокировать то что нужно, а потом уже обновлять. С хиберовским же подходом, получается так, что он пуляет кривой select for update в базу, не получает результата и кидает StaleObjectStateException, от которого толку вообще никакого нет, вот что с ним делать? Ловить в цикле пока не пропадет? а как понять что вообще случилось? Ситуация что строчки в базе нет может быть вызвана по крайней мере тремя причинами, нам еще каждую гипотезу проверять и тоже перехватывать исключения? Вот на ровном месте получается куча стремного кода. Зачем тогда вообще использовать Version? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 20:33 |
|
скала слик
|
|||
---|---|---|---|
#18+
забыл никЗачем тогда вообще использовать Version?Без @Version пользаки будут данные друг друга тихо перетирать, если вы предлагаете вместо @Version пилить что-то свое, то это опять же будет камень в сторону хибера. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 20:43 |
|
скала слик
|
|||
---|---|---|---|
#18+
Андрей Панфиловзабыл никЗачем тогда вообще использовать Version?Без @Version пользаки будут данные друг друга тихо перетирать, если вы предлагаете вместо @Version пилить что-то свое, то это опять же будет камень в сторону хибера. То что хибер говно, я не спорю от слова совсем. Но ваш юзкейс все равно непонятен. Получается что у вас есть как минимум два места изменения одной сущности с существенно различающимся паттерном, в одном случае пессимистичная блокировка, в другом оптимистичная. Но пессимистичная используется когда высокий шанс коллизии, а если такой шанс есть, то имеет смысл использовать пессимистик-лок ВСЕГДА, как-то у меня картина не сходится. Это не в укор, хоть я и повидал много бизнес-доменов, но такое вижу впервые, поэтому и интересно узнать в каких случаях такое бывает. Обычно есть какие-то пользовательские операции и батч процесс над одними и теми же данными, но обычно они моделируются разными средствами, и писать батчинг на хибернейт как-то совсем не айс. У меня это вообще обычно отдельным модулем, в нативном sql-запросе, с отклбченным автокомитом, блокировкой всей таблицы на это время, а еще лучше просто использовать другую таблицу да и все. Стараюсь придерживаться правила - каждая сущность может быть изменена ровно одним способом, поэтому и таких проблем не встречал. Было бы интересно послушать обоснование вашего выбора. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 21:22 |
|
скала слик
|
|||
---|---|---|---|
#18+
забыл никНо пессимистичная используется когда высокий шанс коллизии, а если такой шанс есть, то имеет смысл использовать пессимистик-лок ВСЕГДА, как-то у меня картина не сходится. Это не в укор, хоть я и повидал много бизнес-доменов, но такое вижу впервые, поэтому и интересно узнать в каких случаях такое бывает.Ну сначала вы придумали уловное разделение на пессимистичные/оптимистичные и всегда/невсегда, а теперь пытаетесь заставить меня обосновать такое разделение, ну давайте попробуем. разделение на всегда/невсегда неверное, просто потому что при записи (обновлении) в базу блокировка возникает всегда и длится от момента когда мы захватили строку до коммита/отката транзакции, правильно здесь делить на явные/неявные. Поэтому если мы на 100% уверены, что вот в этом определенном месте мы будем писать в базу (к примеру от пользователя пришел запрос на обновление), какого-либо смысла не ставить блокировку нет - она так или иначе возникнет, вопрос здесь только в том когда она возникнет, и вот здесь уже начинаются нюансы, а именно: - база позволяет "подсмотреть" заблокирована строка, которую мы собираемся обновлять или нет, соответственно если мы пытаемся поставить блокировку сразу, то у нас есть возможность указать сколько времени вообще ждать, чтобы не обламывать нашего любимого пользователя, а "сразу" сказать что ждать тут нечего - если мы явные блокировки там где нужно не ставим, то начинаем ловить лулзы уже из-за неявных (там всякие автофлаши и пр.) - и здесь уже никаких таймаутов нет, и соломку не подложить разделение на пессимистичные/оптимистичные вообще какое-то кривое, потому что из названия суть непонятна - просто так повелось, основная задача в "оптимистичных" - это производить обновления данных в базе актуальным вектором изменений, мы просто маркируем изменения штампом версии и перед тем как обновить сравниваем что там в базе, а блокировки здесь вообще никакой нет, более того, что мешает после подобной оптимистичной проверки заблокировать строку, чтобы больше никто не влез? ничего не мешает и противоречия/конфликта/пр здесь никакого я не вижу, более того, сам подход следовало бы назвать не "оптимистичным", а "наивным", ну вот что толку от того, что из 10 записей мы обновили 9, а на десятой обломались, потому что кто-то другой влез? мы во-первых, свою задачу не выполнили, во-вторых еще кого-то заблокировали. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 22:47 |
|
скала слик
|
|||
---|---|---|---|
#18+
забыл никmayton, Пылинка имеет ввиду, что использовать одновременно и поле Version и пессимистичную блокировку немного бессмысленно. Тут или трусы или крестик +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 22:58 |
|
скала слик
|
|||
---|---|---|---|
#18+
Странный спор. Это как спорить что лучше - КамАЗ или Матиз )). Ну смотря что тебе надо. А насчёт того что хибер гапно .. чтобы понять что хибер не гапно можно просто поюзать Слик. Кстати, я так понимаю по первому сообщению в этом топике там улучшать особо нечего и некуда? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 23:43 |
|
|
start [/forum/topic.php?fid=59&msg=39788308&tid=2121419]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 152ms |
0 / 0 |