|
скала слик
|
|||
---|---|---|---|
#18+
Собссно вопрос.. приходится работать над проектом где заюзан этот чудесный фреймворк. я до сих пор не пойму это орм или не орм или орм-инвалид. и понимаю что где они в слике через пятку ухо чешут в хибере будет две строчки. ну ладно. вопрос такой. у меня есть допустим, сущность человек. у него есть ссылка на адрес. человек это таблица с фк адреса. адрес это тоже таблица мне надо вытащить объект вида class Peep(field:String, field2:String, field3:Option[Address]) -- вроде банально и просто для хибера. но как делать это в слике (нормально) я не понимаю можно по тупому из дб.ран выдрать через тейблПипКвери джойн тейблАддресКвери сущности вида в трейте (peep, address) потом каким-нибудь маппером их склеить в peepWithAddress но это как то через зад. ну ок.. даже так.. а если у меня будет трейт из 5-8-10-ти объектов? да это ж бред. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 13:58 |
|
скала слик
|
|||
---|---|---|---|
#18+
короче нет ) нельзя. слик против. это против их философии. типа выгружай сущности отдельно а потом сам собирай их как-нибудь. угу. красавцы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 15:31 |
|
скала слик
|
|||
---|---|---|---|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
сама сущность выглядит так: class EntityA( fieldA:String, ... fieldZ:String, entityB:Option[EntityB], entityC:Option[EntityC], entityD:Option[EntityD], entityE:Option[EntityE], entityF:Option[EntityF], ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 19:17 |
|
скала слик
|
|||
---|---|---|---|
#18+
Не знаю что это. Но этот код ужасен. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 19:30 |
|
скала слик
|
|||
---|---|---|---|
#18+
да. он очень ужасен. в хибере это одна строчка. а тут гамно какое то. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:08 |
|
скала слик
|
|||
---|---|---|---|
#18+
зы (имена изменены) если по неймингу претензии. хотя думаю нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:09 |
|
скала слик
|
|||
---|---|---|---|
#18+
Я очень уважаю Scala. Но этот код - unsupportable. Как его читать? Как вносить изменения? Где бизнес сущности? Что это за нелепое нагромождение подчеркиваний? Подозреваю что данный запрос на целевом DSL(SQL) был бы красив и компактен. Скала конечно это тот еще универсал. Но иногда ребята перегибают палку. Хотел-бы я понят мотивации к писанию такого. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:12 |
|
скала слик
|
|||
---|---|---|---|
#18+
maytonЯ очень уважаю Scala. Но этот код - unsupportable. Как его читать? Как вносить изменения? Где бизнес сущности? Что это за нелепое нагромождение подчеркиваний? Подозреваю что данный запрос на целевом DSL(SQL) был бы красив и компактен. Скала конечно это тот еще универсал. Но иногда ребята перегибают палку. Хотел-бы я понят мотивации к писанию такого. по-моему andreykaT тупо тролит... я вот беру хибернейт, и у меня просто нереально бомбит от того, как в нем сделаны некоторые, не особо популярные места ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:14 |
|
скала слик
|
|||
---|---|---|---|
#18+
maytonЯ очень уважаю Scala. Но этот код - unsupportable. Как его читать? Как вносить изменения? Где бизнес сущности? Что это за нелепое нагромождение подчеркиваний? Подозреваю что данный запрос на целевом DSL(SQL) был бы красив и компактен. Скала конечно это тот еще универсал. Но иногда ребята перегибают палку. Хотел-бы я понят мотивации к писанию такого. я не нашел способа в слике вытащить одним запросом сущность и все ее нестед поля-сущности. кроме того сам слик говорит вот что: авторThe problem is that this hard-codes that a Person requires an Address. It cannot be loaded without it. This doesn’t fit to Slick’s philosophy of giving you fine-grained control over what you load exactly. With Slick it is advised to map one table to a tuple or case class without them having object references to related objects. Instead you can write a function that joins two tables and returns them as a tuple or association case class instance, providing an association externally, not strongly tied one of the classes. т.е. они считают это НОРМАЛЬНЫМ. можно переложить тапель на сущность. это чуть улучшит картинку но всё-равно говно. еще прям везде читается если тебе такая конструкция понадобилась то ты делаешь что-то не так. а да. еще в слике ограничение на 24 поля. говно вдвойне. они считают что в таблице не может быть больше полей чем полей в скаловском тапле? они это серьезно? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:15 |
|
скала слик
|
|||
---|---|---|---|
#18+
Андрей ПанфиловmaytonЯ очень уважаю Scala. Но этот код - unsupportable. Как его читать? Как вносить изменения? Где бизнес сущности? Что это за нелепое нагромождение подчеркиваний? Подозреваю что данный запрос на целевом DSL(SQL) был бы красив и компактен. Скала конечно это тот еще универсал. Но иногда ребята перегибают палку. Хотел-бы я понят мотивации к писанию такого. по-моему andreykaT тупо тролит... я вот беру хибернейт, и у меня просто нереально бомбит от того, как в нем сделаны некоторые, не особо популярные места и что в хибере не так? у тебя сущность а с 3-4-мя нестед сущностями у тебя будет запрос в РОВНО ОДНУ СТРОЧКУ записанный кемелкейсом в интерфейсе. даже аннотаций не надо. и тебе вылетет сущность со всеми нестедами внутри. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:17 |
|
скала слик
|
|||
---|---|---|---|
#18+
В Java Tuples в реализации https://howtodoinjava.com/java/basics/java-tuples/ разрешено 10 сущностей в тупле. Да фигня это всё. По хорошему если тебе надо нечто больше чем Pair - бери создавай сущность. Или чухай в Lisp. Зачем сову сношать глобусом? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:19 |
|
скала слик
|
|||
---|---|---|---|
#18+
а да если что код не мой но я хочу его отрефачить. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:20 |
|
скала слик
|
|||
---|---|---|---|
#18+
maytonВ Java Tuples в реализации https://howtodoinjava.com/java/basics/java-tuples/ разрешено 10 сущностей в тупле. Да фигня это всё. По хорошему если тебе надо нечто больше чем Pair - бери создавай сущность. Или чухай в Lisp. Зачем сову сношать глобусом? ты можешь его сделать так: .map(EntityWithNestedEntityFields.tupled) - и он у тебя соберет всё в одну сущность.. но тебе же это надо писать и всё-равно у тебя в какой-то момент времени будет вылетать колбаса из тупла с объектами. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:22 |
|
скала слик
|
|||
---|---|---|---|
#18+
andreykaTа да если что код не мой но я хочу его отрефачить. А покажи стандартный туториал по Слику где описано как это делать православно? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:27 |
|
скала слик
|
|||
---|---|---|---|
#18+
http://slick.lightbend.com/doc/3.2.0/orm-to-slick.html Код: java 1. 2. 3. 4. 5.
ну в общем, сверху это вполне по-сликовски православно )) просто у них нет примеров с мультиджойнами )) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:29 |
|
скала слик
|
|||
---|---|---|---|
#18+
Ну... туториал нормален. Там нет такого code-mess... Похорони мультиджойны. Замени на банальный native-SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:31 |
|
скала слик
|
|||
---|---|---|---|
#18+
проблема нативскуэля в том что если у тебя доменная модель поменяется допустим, ты банально увидишь что у тебя что то сломалось только когда тестами гонять будешь. если они вообще у тебя будут и будут покрывать этот кейс. поэтому хотелось бы оставить дсл. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:34 |
|
скала слик
|
|||
---|---|---|---|
#18+
andreykaTи что в хибере не так? впечатление такое, что куда не плюнь - везде какие-то грабли находятся. andreykaTу тебя сущность а с 3-4-мя нестед сущностями у тебя будет запрос в РОВНО ОДНУ СТРОЧКУ записанный кемелкейсом в интерфейсе. даже аннотаций не надо. и тебе вылетет сущность со всеми нестедами внутри.Насколько я помню, вышеупомянутый пример от скалы можно выполнить только в хибере 5.1 и более поздних версиях ( Entity joins (or ad hoc joins) ) - кажется несколько странным что вроде как разумная фича появилась сравнительно недавно... а вот в JPA Criteria API так сделать до сих пор нельзя - нужно в сущностях прописывать маппинг, а после этого начинается неполовая ##ля с тем, что имбецилы из redhatхибернейт считает себя самым умным и начинает все эти сущности из маппинга на каждый чих тянуть из базы, собственно если захочется в хибере подкрутить производительность до уровня "я так вижу", то будет уйма незабываемых впечатлений. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:34 |
|
скала слик
|
|||
---|---|---|---|
#18+
maytonНу... туториал нормален. Там нет такого code-mess... потому что там нет примеров где джойна больше 1 а так и я могу ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:35 |
|
скала слик
|
|||
---|---|---|---|
#18+
Андрей ПанфиловandreykaTи что в хибере не так? впечатление такое, что куда не плюнь - везде какие-то грабли находятся. andreykaTу тебя сущность а с 3-4-мя нестед сущностями у тебя будет запрос в РОВНО ОДНУ СТРОЧКУ записанный кемелкейсом в интерфейсе. даже аннотаций не надо. и тебе вылетет сущность со всеми нестедами внутри.Насколько я помню, вышеупомянутый пример от скалы можно выполнить только в хибере 5.1 и более поздних версиях ( Entity joins (or ad hoc joins) ) - кажется несколько странным что вроде как разумная фича появилась сравнительно недавно... а вот в JPA Criteria API так сделать до сих пор нельзя - нужно в сущностях прописывать маппинг, а после этого начинается неполовая ##ля с тем, что имбецилы из redhatхибернейт считает себя самым умным и начинает все эти сущности из маппинга на каждый чих тянуть из базы, собственно если захочется в хибере подкрутить производительность до уровня "я так вижу", то будет уйма незабываемых впечатлений. юзай проекции. они тебя спасут. если тебе не нравится что хибер что-то лишнее на твой взгляд вытягивает. но вот в слике банальное персона с адресом уже не вытащить нормально ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:37 |
|
скала слик
|
|||
---|---|---|---|
#18+
andreykaTпроблема нативскуэля в том что если у тебя доменная модель поменяется допустим, ты банально увидишь что у тебя что то сломалось только когда тестами гонять будешь. если они вообще у тебя будут и будут покрывать этот кейс. поэтому хотелось бы оставить дсл. Выкрутился ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:40 |
|
скала слик
|
|||
---|---|---|---|
#18+
andreykaTюзай проекции. они тебя спасут. если тебе не нравится что хибер что-то лишнее на твой взгляд вытягивает. Ничем оно не поможет. Вот сущность: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
там FetchType.LAZY работать никогда не будет, потому что так устроен хибернейт. Предлагаю дальше тему не развивать, поскольку примеров масса и хибернейт - это УГ, факт. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:48 |
|
скала слик
|
|||
---|---|---|---|
#18+
ну и пусть. тебе жалко чтоле? лейзи опасны на списках. а на единичных нестедах да пофиг у тебя скорее ботлнек случится где угодно но не тут. в общем возвращаясь к слику.. это как-то можно улучшить? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:56 |
|
скала слик
|
|||
---|---|---|---|
#18+
*т.е. не лейзи а отсутствите лейзи - и.е. игеры опасны на списках. на полях с одной сущностью игеры фигня. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2019, 20:57 |
|
скала слик
|
|||
---|---|---|---|
#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 |
|
скала слик
|
|||
---|---|---|---|
#18+
andreykaTСтранный спор. Это как спорить что лучше - КамАЗ или Матиз )). Ну смотря что тебе надо. А насчёт того что хибер гапно .. чтобы понять что хибер не гапно можно просто поюзать Слик. Кстати, я так понимаю по первому сообщению в этом топике там улучшать особо нечего и некуда? +1, на слике нельзя использовать поля сущности в update выражении, напр., не получится написать в одно выражение запрос вила update x set a = a + 1, т. е. нужно сначала сначала вычитать, сложить и затем заапдейтить. Уже пять лет эта фича ждёт своего часа ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2019, 03:29 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2121419]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 146ms |
0 / 0 |