powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / скала слик
52 сообщений из 52, показаны все 3 страниц
скала слик
    #39787766
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собссно вопрос.. приходится работать над проектом где заюзан этот чудесный фреймворк.
я до сих пор не пойму это орм или не орм или орм-инвалид. и понимаю что где они в слике через пятку ухо чешут в хибере будет две строчки. ну ладно.

вопрос такой. у меня есть допустим, сущность человек. у него есть ссылка на адрес. человек это таблица с фк адреса. адрес это тоже таблица мне надо вытащить объект вида
class Peep(field:String, field2:String, field3:Option[Address]) -- вроде банально и просто для хибера. но как делать это в слике (нормально) я не понимаю

можно по тупому из дб.ран выдрать через тейблПипКвери джойн тейблАддресКвери сущности вида в трейте (peep, address) потом каким-нибудь маппером их склеить в peepWithAddress но это как то через зад.

ну ок.. даже так.. а если у меня будет трейт из 5-8-10-ти объектов? да это ж бред.
...
Рейтинг: 0 / 0
скала слик
    #39787848
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче нет ) нельзя. слик против. это против их философии. типа выгружай сущности отдельно а потом сам собирай их как-нибудь. угу. красавцы.
...
Рейтинг: 0 / 0
скала слик
    #39788018
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоть код покажи.
...
Рейтинг: 0 / 0
скала слик
    #39788031
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  def whateverMethodFromRepoFindOneByTwoEntities(id: Long, xId: Long) = {
    
val q = entityAQuery.filter(_.id === id).filter(_.xId === xId) joinLeft
       entityBQuery on (_.entityAId === _.id) joinLeft
       entityCQuery on (_._1.entityBId=== _.id) joinLeft
       entityDuery on (_._1._1.entityCId === _.id) joinLeft
       entityEQuery on (_._1._1._1.entityEId === _.id) joinLeft
       entityFQuery on (_._1._1._1._1.entityFId === _.id)
    db.run {
      val r = for {
        (((((entityA, entityB), entityC), entityD), entityE), entityF) <- q
      } yield (entityA, entityB, entityC, entityD, entityE, entityF)
      r.result.headOption
    }
  }



сама сущность выглядит так:

class EntityA(
fieldA:String,
...
fieldZ:String,
entityB:Option[EntityB],
entityC:Option[EntityC],
entityD:Option[EntityD],
entityE:Option[EntityE],
entityF:Option[EntityF],
)
...
Рейтинг: 0 / 0
скала слик
    #39788033
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю что это. Но этот код ужасен.
...
Рейтинг: 0 / 0
скала слик
    #39788043
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да. он очень ужасен. в хибере это одна строчка. а тут гамно какое то.
...
Рейтинг: 0 / 0
скала слик
    #39788044
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы (имена изменены) если по неймингу претензии. хотя думаю нет.
...
Рейтинг: 0 / 0
скала слик
    #39788047
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я очень уважаю Scala. Но этот код - unsupportable. Как его читать? Как вносить изменения?
Где бизнес сущности? Что это за нелепое нагромождение подчеркиваний?

Подозреваю что данный запрос на целевом DSL(SQL) был бы красив и компактен.

Скала конечно это тот еще универсал. Но иногда ребята перегибают палку. Хотел-бы
я понят мотивации к писанию такого.
...
Рейтинг: 0 / 0
скала слик
    #39788048
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ очень уважаю Scala. Но этот код - unsupportable. Как его читать? Как вносить изменения?
Где бизнес сущности? Что это за нелепое нагромождение подчеркиваний?

Подозреваю что данный запрос на целевом DSL(SQL) был бы красив и компактен.

Скала конечно это тот еще универсал. Но иногда ребята перегибают палку. Хотел-бы
я понят мотивации к писанию такого.

по-моему andreykaT тупо тролит... я вот беру хибернейт, и у меня просто нереально бомбит от того, как в нем сделаны некоторые, не особо популярные места
...
Рейтинг: 0 / 0
скала слик
    #39788049
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 поля. говно вдвойне. они считают что в таблице не может быть больше полей чем полей в скаловском тапле? они это серьезно?
...
Рейтинг: 0 / 0
скала слик
    #39788051
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловmaytonЯ очень уважаю Scala. Но этот код - unsupportable. Как его читать? Как вносить изменения?
Где бизнес сущности? Что это за нелепое нагромождение подчеркиваний?

Подозреваю что данный запрос на целевом DSL(SQL) был бы красив и компактен.

Скала конечно это тот еще универсал. Но иногда ребята перегибают палку. Хотел-бы
я понят мотивации к писанию такого.

по-моему andreykaT тупо тролит... я вот беру хибернейт, и у меня просто нереально бомбит от того, как в нем сделаны некоторые, не особо популярные места
и что в хибере не так? у тебя сущность а с 3-4-мя нестед сущностями у тебя будет запрос в РОВНО ОДНУ СТРОЧКУ записанный кемелкейсом в интерфейсе. даже аннотаций не надо. и тебе вылетет сущность со всеми нестедами внутри.
...
Рейтинг: 0 / 0
скала слик
    #39788052
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Java Tuples в реализации https://howtodoinjava.com/java/basics/java-tuples/ разрешено 10 сущностей в тупле.
Да фигня это всё. По хорошему если тебе надо нечто больше чем Pair - бери создавай сущность. Или чухай в Lisp.

Зачем сову сношать глобусом?
...
Рейтинг: 0 / 0
скала слик
    #39788054
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а да если что код не мой но я хочу его отрефачить.
...
Рейтинг: 0 / 0
скала слик
    #39788055
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ Java Tuples в реализации https://howtodoinjava.com/java/basics/java-tuples/ разрешено 10 сущностей в тупле.
Да фигня это всё. По хорошему если тебе надо нечто больше чем Pair - бери создавай сущность. Или чухай в Lisp.

Зачем сову сношать глобусом?
ты можешь его сделать так: .map(EntityWithNestedEntityFields.tupled) - и он у тебя соберет всё в одну сущность.. но тебе же это надо писать и всё-равно у тебя в какой-то момент времени будет вылетать колбаса из тупла с объектами.
...
Рейтинг: 0 / 0
скала слик
    #39788060
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTа да если что код не мой но я хочу его отрефачить.
А покажи стандартный туториал по Слику где описано как это делать православно?
...
Рейтинг: 0 / 0
скала слик
    #39788064
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://slick.lightbend.com/doc/3.2.0/orm-to-slick.html
Код: java
1.
2.
3.
4.
5.
val tupledJoin: Query[(People,Addresses),(Person,Address), Seq]
      = people join addresses on (_.addressId === _.id)

case class PersonWithAddress(person: Person, address: Address)
val caseClassJoinResults = db.run(tupledJoin.result).map(_.map(PersonWithAddress.tupled))



ну в общем, сверху это вполне по-сликовски православно )) просто у них нет примеров с мультиджойнами ))
...
Рейтинг: 0 / 0
скала слик
    #39788065
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... туториал нормален. Там нет такого code-mess...

Похорони мультиджойны. Замени на банальный native-SQL.
...
Рейтинг: 0 / 0
скала слик
    #39788067
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема нативскуэля в том что если у тебя доменная модель поменяется допустим, ты банально увидишь что у тебя что то сломалось только когда тестами гонять будешь. если они вообще у тебя будут и будут покрывать этот кейс. поэтому хотелось бы оставить дсл.
...
Рейтинг: 0 / 0
скала слик
    #39788068
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTи что в хибере не так?
впечатление такое, что куда не плюнь - везде какие-то грабли находятся.
andreykaTу тебя сущность а с 3-4-мя нестед сущностями у тебя будет запрос в РОВНО ОДНУ СТРОЧКУ записанный кемелкейсом в интерфейсе. даже аннотаций не надо. и тебе вылетет сущность со всеми нестедами внутри.Насколько я помню, вышеупомянутый пример от скалы можно выполнить только в хибере 5.1 и более поздних версиях ( Entity joins (or ad hoc joins) ) - кажется несколько странным что вроде как разумная фича появилась сравнительно недавно... а вот в JPA Criteria API так сделать до сих пор нельзя - нужно в сущностях прописывать маппинг, а после этого начинается неполовая ##ля с тем, что имбецилы из redhatхибернейт считает себя самым умным и начинает все эти сущности из маппинга на каждый чих тянуть из базы, собственно если захочется в хибере подкрутить производительность до уровня "я так вижу", то будет уйма незабываемых впечатлений.
...
Рейтинг: 0 / 0
скала слик
    #39788069
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу... туториал нормален. Там нет такого code-mess...

потому что там нет примеров где джойна больше 1 а так и я могу
...
Рейтинг: 0 / 0
скала слик
    #39788070
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловandreykaTи что в хибере не так?
впечатление такое, что куда не плюнь - везде какие-то грабли находятся.
andreykaTу тебя сущность а с 3-4-мя нестед сущностями у тебя будет запрос в РОВНО ОДНУ СТРОЧКУ записанный кемелкейсом в интерфейсе. даже аннотаций не надо. и тебе вылетет сущность со всеми нестедами внутри.Насколько я помню, вышеупомянутый пример от скалы можно выполнить только в хибере 5.1 и более поздних версиях ( Entity joins (or ad hoc joins) ) - кажется несколько странным что вроде как разумная фича появилась сравнительно недавно... а вот в JPA Criteria API так сделать до сих пор нельзя - нужно в сущностях прописывать маппинг, а после этого начинается неполовая ##ля с тем, что имбецилы из redhatхибернейт считает себя самым умным и начинает все эти сущности из маппинга на каждый чих тянуть из базы, собственно если захочется в хибере подкрутить производительность до уровня "я так вижу", то будет уйма незабываемых впечатлений.
юзай проекции. они тебя спасут. если тебе не нравится что хибер что-то лишнее на твой взгляд вытягивает.

но вот в слике банальное персона с адресом уже не вытащить нормально
...
Рейтинг: 0 / 0
скала слик
    #39788074
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTпроблема нативскуэля в том что если у тебя доменная модель поменяется допустим, ты банально увидишь что у тебя что то сломалось только когда тестами гонять будешь. если они вообще у тебя будут и будут покрывать этот кейс. поэтому хотелось бы оставить дсл.
Выкрутился
...
Рейтинг: 0 / 0
скала слик
    #39788077
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTюзай проекции. они тебя спасут. если тебе не нравится что хибер что-то лишнее на твой взгляд вытягивает.

Ничем оно не поможет. Вот сущность:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Entity {

	@Id
	@Column("SURROGATE_KEY")
	protected Long id;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "NATURAL_KEY_REF", referencedColumnName = "NATURAL_KEY")
	private Other other;

}



там FetchType.LAZY работать никогда не будет, потому что так устроен хибернейт. Предлагаю дальше тему не развивать, поскольку примеров масса и хибернейт - это УГ, факт.
...
Рейтинг: 0 / 0
скала слик
    #39788082
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и пусть. тебе жалко чтоле? лейзи опасны на списках. а на единичных нестедах да пофиг у тебя скорее ботлнек случится где угодно но не тут.

в общем возвращаясь к слику.. это как-то можно улучшить? )
...
Рейтинг: 0 / 0
скала слик
    #39788084
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*т.е. не лейзи а отсутствите лейзи - и.е. игеры опасны на списках. на полях с одной сущностью игеры фигня.
...
Рейтинг: 0 / 0
скала слик
    #39788099
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonandreykaTпроблема нативскуэля в том что если у тебя доменная модель поменяется допустим, ты банально увидишь что у тебя что то сломалось только когда тестами гонять будешь. если они вообще у тебя будут и будут покрывать этот кейс. поэтому хотелось бы оставить дсл.
Выкрутился
Я вообще в ужасе - как же живут чисто sql-программисты, типа на PL/SQL, и не тужат.
...
Рейтинг: 0 / 0
скала слик
    #39788115
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе знаю что это. Но этот код ужасен.

Вопрос привычки. 12 строк кода на 6 джойнов, по-моему очень даже неплохо.

Вот пример джойна на хаскел

Код: java
1.
2.
3.
4.
5.
select $
from $ \(b, p) -> do
where_ (b ^. BlogPostAuthorId ==. p ^. PersonId)
orderBy [asc (b ^. BlogPostTitle)]
return (b, p)



После 15 лет на джаве может показаться мозголомным, кому-то элегантным
...
Рейтинг: 0 / 0
скала слик
    #39788163
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловandreykaTюзай проекции. они тебя спасут. если тебе не нравится что хибер что-то лишнее на твой взгляд вытягивает.

Ничем оно не поможет. Вот сущность:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Entity {

	@Id
	@Column("SURROGATE_KEY")
	protected Long id;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "NATURAL_KEY_REF", referencedColumnName = "NATURAL_KEY")
	private Other other;

}



а почему тут работать не будет? Я думал проблемы с onetoone ?
там FetchType.LAZY работать никогда не будет, потому что так устроен хибернейт. Предлагаю дальше тему не развивать, поскольку примеров масса и хибернейт - это УГ, факт.
...
Рейтинг: 0 / 0
скала слик
    #39788186
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а почему тут работать не будет? Я думал проблемы с onetoone ?
...
Рейтинг: 0 / 0
скала слик
    #39788233
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинкаmaytonпропущено...

Выкрутился
Я вообще в ужасе - как же живут чисто sql-программисты, типа на PL/SQL, и не тужат.
Если меняется доменная модель то процедуры, вьюшки и прочие объекты домена БД переходят в invalid state.
Далее - задача PLSQL разработчика - просто просмотреть список объектов и по каждому принять решение.

Но поскольку Java ORM создавались в отрыве от конкретной БД то такой функционал им недоступен.
...
Рейтинг: 0 / 0
скала слик
    #39788239
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Это в оракле.
В остальных вроде этого нет.
...
Рейтинг: 0 / 0
скала слик
    #39788268
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверина почему тут работать не будет? Я думал проблемы с 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
...
Рейтинг: 0 / 0
скала слик
    #39788271
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловOneToOneтакое отношение и бд разрабы не любят.
Неудивительно что грабли.
...
Рейтинг: 0 / 0
скала слик
    #39788308
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПылинкапропущено...

Я вообще в ужасе - как же живут чисто sql-программисты, типа на PL/SQL, и не тужат.
Если меняется доменная модель то процедуры, вьюшки и прочие объекты домена БД переходят в invalid state.
Далее - задача PLSQL разработчика - просто просмотреть список объектов и по каждому принять решение.

Но поскольку Java ORM создавались в отрыве от конкретной БД то такой функционал им недоступен.
это что такое - в отрыве от конкретной БД ? Ничего не понял.
1) объекты БД точно так же перейдут (или не перейдут) в это состояние.
2) если вам нужны сущности ORM - то у вас что, не работает поиск объявления и использования классов JAVA? Точно так же получите весь список.
...
Рейтинг: 0 / 0
скала слик
    #39788332
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловОзверина почему тут работать не будет? Я думал проблемы с 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
...
Рейтинг: 0 / 0
скала слик
    #39788347
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверина потом меня спрашивают, почему я могу предпочесть запросы сущностям со связями.Ну это только одна из проблем, а там их горы, вот примеры:

захотел в старом хибере чтобы он мне 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

ну и в общем так постоянно: чуть в сторону от элементарных вещей и сразу грабли на ровном месте.
...
Рейтинг: 0 / 0
скала слик
    #39788422
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинкаmaytonпропущено...

Если меняется доменная модель то процедуры, вьюшки и прочие объекты домена БД переходят в invalid state.
Далее - задача PLSQL разработчика - просто просмотреть список объектов и по каждому принять решение.

Но поскольку Java ORM создавались в отрыве от конкретной БД то такой функционал им недоступен.
это что такое - в отрыве от конкретной БД ? Ничего не понял.
1) объекты БД точно так же перейдут (или не перейдут) в это состояние.
2) если вам нужны сущности ORM - то у вас что, не работает поиск объявления и использования классов JAVA? Точно так же получите весь список.
1) Я не буду писать много букв. Много лет назад были выпущены статьи на тему недостатков ORM.
Вкратце оно называется object relational impedance mismatch . Поищите.

2) Мой комментарий касался отзывчивости среды разработки БД к изменениям (например удалена колонка из таблицы).
И неотзывчивости ORM-средств которые детектируют это изменние только в фазе непосредственного выполнения.
Даже не в компилляции. Тоже самое кажется спрашивал и мой собеседник. Его беспокоила скорость реакции
системы на изменения. Ну ... я так это понял.
...
Рейтинг: 0 / 0
скала слик
    #39788605
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловзахотели блокировки в нужных местах делать, вроде паттерн стандартный: блокируем запись по id, потом обновляем сущность из БД, а вот нельзя так если в сущности есть @Version-поле - это поделие зачем-то в запрос условие на штамп версии вставляет:

Зачем блокировать пессимистически, если там автоматом оптимистическая блокировка встроена?
...
Рейтинг: 0 / 0
скала слик
    #39788613
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаАндрей Панфиловзахотели блокировки в нужных местах делать, вроде паттерн стандартный: блокируем запись по id, потом обновляем сущность из БД, а вот нельзя так если в сущности есть @Version-поле - это поделие зачем-то в запрос условие на штамп версии вставляет:

Зачем блокировать пессимистически, если там автоматом оптимистическая блокировка встроена?
А с каких пор оптимистическая стала рекомендованным шаблоном?
...
Рейтинг: 0 / 0
скала слик
    #39788614
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверина потом меня спрашивают, почему я могу предпочесть запросы сущностям со связями.
Я так понимаю, был какой-то выход, но даже этот выход хибернейтовсцы умудрились сломать:

"Мы" уже давно пришли к выводу что такие связи в ORM - зло. Аналог их встроен в ADF, у нас был "корпоротивный стандарт" (длительный опыт) - никак связи не использовать.
...
Рейтинг: 0 / 0
скала слик
    #39788615
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА с каких пор оптимистическая стала рекомендованным шаблоном?
А с какого там тогда Version поле?
...
Рейтинг: 0 / 0
скала слик
    #39788619
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаmaytonА с каких пор оптимистическая стала рекомендованным шаблоном?
А с какого там тогда Version поле?
А я ничего вообще не говорил про Version. Интересный у нас разговор получается. Может нам стоит вернуться в начало?
...
Рейтинг: 0 / 0
скала слик
    #39788645
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Пылинка имеет ввиду, что использовать одновременно и поле Version и пессимистичную блокировку немного бессмысленно. Тут или трусы или крестик
...
Рейтинг: 0 / 0
скала слик
    #39788646
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаЗачем блокировать пессимистически, если там автоматом оптимистическая блокировка встроена?не автоматом, а костылем. Оптимистичная блокировка полезна в довольно ограниченных случаях, а именно когда пользователь пытается сохранить строку, а мы его отшиваем и говорим: тут пока ты думал что-то поменялось, иди и разбирайся сам что произошло, в остальных случаях пользы от нее никакой: ну на кой черт нам что-то обрабатывать, а потом в коммите словить ошибку, что не получилось? мы же наверняка знаем что будем менять, поэтому на порядок проще заблокировать то что нужно, а потом уже обновлять. С хиберовским же подходом, получается так, что он пуляет кривой select for update в базу, не получает результата и кидает StaleObjectStateException, от которого толку вообще никакого нет, вот что с ним делать? Ловить в цикле пока не пропадет? а как понять что вообще случилось? Ситуация что строчки в базе нет может быть вызвана по крайней мере тремя причинами, нам еще каждую гипотезу проверять и тоже перехватывать исключения? Вот на ровном месте получается куча стремного кода.
...
Рейтинг: 0 / 0
скала слик
    #39788649
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловПылинкаЗачем блокировать пессимистически, если там автоматом оптимистическая блокировка встроена?не автоматом, а костылем. Оптимистичная блокировка полезна в довольно ограниченных случаях, а именно когда пользователь пытается сохранить строку, а мы его отшиваем и говорим: тут пока ты думал что-то поменялось, иди и разбирайся сам что произошло, в остальных случаях пользы от нее никакой: ну на кой черт нам что-то обрабатывать, а потом в коммите словить ошибку, что не получилось? мы же наверняка знаем что будем менять, поэтому на порядок проще заблокировать то что нужно, а потом уже обновлять. С хиберовским же подходом, получается так, что он пуляет кривой select for update в базу, не получает результата и кидает StaleObjectStateException, от которого толку вообще никакого нет, вот что с ним делать? Ловить в цикле пока не пропадет? а как понять что вообще случилось? Ситуация что строчки в базе нет может быть вызвана по крайней мере тремя причинами, нам еще каждую гипотезу проверять и тоже перехватывать исключения? Вот на ровном месте получается куча стремного кода.

Зачем тогда вообще использовать Version?
...
Рейтинг: 0 / 0
скала слик
    #39788653
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никЗачем тогда вообще использовать Version?Без @Version пользаки будут данные друг друга тихо перетирать, если вы предлагаете вместо @Version пилить что-то свое, то это опять же будет камень в сторону хибера.
...
Рейтинг: 0 / 0
скала слик
    #39788669
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловзабыл никЗачем тогда вообще использовать Version?Без @Version пользаки будут данные друг друга тихо перетирать, если вы предлагаете вместо @Version пилить что-то свое, то это опять же будет камень в сторону хибера.

То что хибер говно, я не спорю от слова совсем. Но ваш юзкейс все равно непонятен. Получается что у вас есть как минимум два места изменения одной сущности с существенно различающимся паттерном, в одном случае пессимистичная блокировка, в другом оптимистичная. Но пессимистичная используется когда высокий шанс коллизии, а если такой шанс есть, то имеет смысл использовать пессимистик-лок ВСЕГДА, как-то у меня картина не сходится. Это не в укор, хоть я и повидал много бизнес-доменов, но такое вижу впервые, поэтому и интересно узнать в каких случаях такое бывает.

Обычно есть какие-то пользовательские операции и батч процесс над одними и теми же данными, но обычно они моделируются разными средствами, и писать батчинг на хибернейт как-то совсем не айс. У меня это вообще обычно отдельным модулем, в нативном sql-запросе, с отклбченным автокомитом, блокировкой всей таблицы на это время, а еще лучше просто использовать другую таблицу да и все. Стараюсь придерживаться правила - каждая сущность может быть изменена ровно одним способом, поэтому и таких проблем не встречал.
Было бы интересно послушать обоснование вашего выбора.
...
Рейтинг: 0 / 0
скала слик
    #39788697
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никНо пессимистичная используется когда высокий шанс коллизии, а если такой шанс есть, то имеет смысл использовать пессимистик-лок ВСЕГДА, как-то у меня картина не сходится. Это не в укор, хоть я и повидал много бизнес-доменов, но такое вижу впервые, поэтому и интересно узнать в каких случаях такое бывает.Ну сначала вы придумали уловное разделение на пессимистичные/оптимистичные и всегда/невсегда, а теперь пытаетесь заставить меня обосновать такое разделение, ну давайте попробуем.

разделение на всегда/невсегда неверное, просто потому что при записи (обновлении) в базу блокировка возникает всегда и длится от момента когда мы захватили строку до коммита/отката транзакции, правильно здесь делить на явные/неявные. Поэтому если мы на 100% уверены, что вот в этом определенном месте мы будем писать в базу (к примеру от пользователя пришел запрос на обновление), какого-либо смысла не ставить блокировку нет - она так или иначе возникнет, вопрос здесь только в том когда она возникнет, и вот здесь уже начинаются нюансы, а именно:
- база позволяет "подсмотреть" заблокирована строка, которую мы собираемся обновлять или нет, соответственно если мы пытаемся поставить блокировку сразу, то у нас есть возможность указать сколько времени вообще ждать, чтобы не обламывать нашего любимого пользователя, а "сразу" сказать что ждать тут нечего
- если мы явные блокировки там где нужно не ставим, то начинаем ловить лулзы уже из-за неявных (там всякие автофлаши и пр.) - и здесь уже никаких таймаутов нет, и соломку не подложить

разделение на пессимистичные/оптимистичные вообще какое-то кривое, потому что из названия суть непонятна - просто так повелось, основная задача в "оптимистичных" - это производить обновления данных в базе актуальным вектором изменений, мы просто маркируем изменения штампом версии и перед тем как обновить сравниваем что там в базе, а блокировки здесь вообще никакой нет, более того, что мешает после подобной оптимистичной проверки заблокировать строку, чтобы больше никто не влез? ничего не мешает и противоречия/конфликта/пр здесь никакого я не вижу, более того, сам подход следовало бы назвать не "оптимистичным", а "наивным", ну вот что толку от того, что из 10 записей мы обновили 9, а на десятой обломались, потому что кто-то другой влез? мы во-первых, свою задачу не выполнили, во-вторых еще кого-то заблокировали.
...
Рейтинг: 0 / 0
скала слик
    #39788702
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никmayton,

Пылинка имеет ввиду, что использовать одновременно и поле Version и пессимистичную блокировку немного бессмысленно. Тут или трусы или крестик
+1
...
Рейтинг: 0 / 0
скала слик
    #39788710
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странный спор. Это как спорить что лучше - КамАЗ или Матиз )). Ну смотря что тебе надо.

А насчёт того что хибер гапно .. чтобы понять что хибер не гапно можно просто поюзать Слик.

Кстати, я так понимаю по первому сообщению в этом топике там улучшать особо нечего и некуда?
...
Рейтинг: 0 / 0
скала слик
    #39788735
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTСтранный спор. Это как спорить что лучше - КамАЗ или Матиз )). Ну смотря что тебе надо.

А насчёт того что хибер гапно .. чтобы понять что хибер не гапно можно просто поюзать Слик.

Кстати, я так понимаю по первому сообщению в этом топике там улучшать особо нечего и некуда?
+1, на слике нельзя использовать поля сущности в update выражении, напр., не получится написать в одно выражение запрос вила update x set a = a + 1, т. е. нужно сначала сначала вычитать, сложить и затем заапдейтить. Уже пять лет эта фича ждёт своего часа
...
Рейтинг: 0 / 0
скала слик
    #39789387
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так. то что слик редкостное говно и годится только для написания адресбука в петпроекте это я уже понял.
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / скала слик
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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