|
|
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slippery, IMHO п.1 универсальный, значит он ничего не знает о содержании контейнерных вкладок и транзакциях в них. Из этого вытекает, что при нажатии Сохранить на родителе вкладок происходит сброс в БД и переоткрытие всех вкладок. Соответственно, при изменении связанных сущностей на вкладке А, при переходе на вкл. Б нужно либо спросить (Обновить\Не обновлять?) либо останутся старые данные. Это надо уточнить и закрепить в ТЗ у заказчика. Иначе будет слишком сильная кастомизация меньше универсализм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:31:34 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slippery, п.2 11900154 - get find - лезет в БД через кэш - любой SQL запрос сначала делает flush, а потом сам запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:35:56 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
можно ещё доавтоматизировать - в классе Вкладка поставить флаг "Требуется перезапрос модели". Если не читал, а Редактировал, то проставить. При смене вкладки Родитель опросит её. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:39:46 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyв нужное время обращаться к лази полям да. т.е. в динамике подгрузить их при отдаче в VIEW? или просто чохом все когда достали из ОРМ? (бывает так делают рекурсивно :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:42:38 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slippery 1) далее: но ваш подход не решает или я посмотрел 1 проблемы, а конкретно добавление в выборку созданных сущностей: "но вот добавлять которых нет, уже не совсем ясно, ведь запросы могли быть по условиям, а не простой селект всех из списка, а если по условии то не факт, что в результат выборки нужно добавить все новые объекты получаемого типа из мапа, может быть только половина подходит. к примеру на первой вкладке добавили двух пользователей с именами Петя, Вася. А на второй делаем запрос "найти всех пользователей чье имя начинается на П" тогда в эту выборку нужно добавить только 1 пользователя из мапа, а не двух. " Причем так как задача у меня стоит написать универсальный визард, то условий я не знаю заранее, имеется ли хорошее решения этой проблемы и если да, то какое???? Ну опять таки - через HQL это нерешаемо. Через сервисы - запросто. Делаете что-то типо getByNameStartWith(String startWith). Этот метод выполняет запрос к базе, потом анализирует содержимое контекста, и объединяет обе коллекции. slippery 2) И еще, вы писали : "Теперь внимание - все HQL/SQL запросы, все критерии - НЕ ИДУТ через кэш первого уровня, они в него не смотрят. Они вытаскивают инормацию сразу из БД и только потом кладут ее в кеш. Поэтому, если вы что-то создали, но не сделали flush(), то нет никакого способа заставить ХИбер вытащить это через HQL запрос. Вообще никак." но проведя эксперимент у меня получилось так: get(A.class, 1); исправил в нем какое-то поле и после сделал так: createQuery("from A").list(); то в результате в списке объектов А будет объект с ид-1 с уже измененным значением поле. То есть хибер заменил объект из выборки на тот что хранится в памяти ну или смержил, внутренностей не знаю. То есть получается что все же не минует кэш первого уровня, ведь измененный но еще не сохраненный в базу объект он подхватил из кэша! Почему в этом случаи это работает????Это немного другое. В этом сценарии вы сначала вытащили некий объект в сессию. Потом имзенили его, но не отправили изменения в БД. Потом вы снова вытащили этот же объект из БД. Хибер выполнил реальный запрос, стал класть результаты в сессию, заметил, что в сессии уже есть объект класса A с id = 1, и не стал перезаписывать его состояние. Так что это ожидаемо. Ну и резюме: как я и думал, все проблемы у вас идут из-за неправильных решений при проектировании. Вы должны понимать, что сессия Хибера это абсолютно чужеродный объект в слое презентации. Сушности, прикрепленные к контексту Хибера это тоже чужеродные объекты для презентации, но при аккуратном использовании их можно все-таки сувать в PL. То есть вы сознательно лишили себя необходимого интерфейса в видо DTO для перехода от доменной модели к PL и обратно, засунули в PL сессию Хибера и теперь мучаетесь с ней. Выхода только два - либо идти моим путем и делать все по уму, либо придумывать всякие велосипедные или неестественные решения (например, как я привел выше - лезть в потроха Хибера). Третьего не дано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:48:45 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123- любой SQL запрос сначала делает flush, а потом сам запрос.Неверно. Никакого flush() не происходит. То есть, правильнее - it depends. В случае автора - с отключенным автоматическим flush(), его не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:50:17 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyи еще дополнение по второму вопросу: (по update объекты), то есть он кладет его в кэш и мержит с тем, что уже там есть, по правилу простой замены, типа тот что уже есть в кэше круче(новее/правильнее) берем его?Сессионный "круче" по дефолту. Но это, скорее всего, можно как-то регулировать. Может быть - setCacheMode() поможет, может еще как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:52:21 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenomPetro123- любой SQL запрос сначала делает flush, а потом сам запрос.Неверно. Никакого flush() не происходит. То есть, правильнее - it depends. В случае автора - с отключенным автоматическим flush(), его не будет. давай так: - по умолчанию (если не отключал) - верно - если отключил, то я читал что flush он падла и иногда делает :). Ты можешь поручиться что он сам ни разу не сбросит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:53:48 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenomТретьего не дано. эх... молодость...категоричность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:56:34 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123- get find - лезет в БД через кэш . а можно про это подробнее в каком смысле в БД через кэш? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:56:45 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenomslipperyи еще дополнение по второму вопросу: (по update объекты), то есть он кладет его в кэш и мержит с тем, что уже там есть, по правилу простой замены, типа тот что уже есть в кэше круче(новее/правильнее) берем его?Сессионный "круче" по дефолту. Но это, скорее всего, можно как-то регулировать. Может быть - setCacheMode() поможет, может еще как. перед тем как положить "пометить что он круче". Merge "если не в курсе" и более долгий\затратный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:58:06 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyPetro123- get find - лезет в БД через кэш . а можно про это подробнее в каком смысле в БД через кэш? любой кэш может быть пустой. Есть объект - берём. Т.е. сначала в кэш - буквально. Есть выражение - при запросе - проскакиваем в БД мимо кэша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:59:45 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
PEtro123- по умолчанию (если не отключал) - верноХз, надо тестировать. В случае SQL запроса - уверен на 95%, что это не так. По поводу HQL - просто сильно сомневаюсь. Petro123- если отключил, то я читал что flush он падла и иногда делает :). Ты можешь поручиться что он сам ни разу не сбросит?Я не могу поручаться за чужой код. Откройте исходники и посмотрите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:01:35 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123svenomТретьего не дано. эх... молодость...категоричность Ждем от вас других вариантов решения. Мои два по сути звучат так: либо дальше мучаться от неправильного решения, принятого ранее, либо же заменить его на правильное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:02:46 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
аффтар! У меня к тебе вопрос: - ты вроде хотел решить задачку методом "оттягивая flush() до конца". - отказался? У меня пока такая инфа, что хибер может сбросить сам, несмотря на ручной флаг. Т.е. это не метод для решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:02:53 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom, я тебе назвал вариант, ты про него только - давай код. Это не так скоро. Концепция - отсоединил и присоединил В ДРУГОЙ ТРАНЗАКЦИИ И ХИБЕР-СЕССИИ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:04:46 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123аффтар! У меня к тебе вопрос: - ты вроде хотел решить задачку методом "оттягивая flush() до конца". - отказался? У меня пока такая инфа, что хибер может сбросить сам, несмотря на ручной флаг. Т.е. это не метод для решения. у меня такой инфы нет, пока остаюсь на этот варианте, если вдруг найдете доказательство сообщите пожалуйста, в моем эксперименте сброса не было, но он не претендует на 100 процентную истину svenom, не могу я поменять архитектуру, придется многое переписать и изменить, а как вы говорили ранее бизнес есть бизнес и такую потерю времени мне не разрешат, так что надо найти наиболее красивое решение с учетом данного момента. Petro123, вы писали: "любой кэш может быть пустой. Есть объект - берём. Т.е. сначала в кэш - буквально. Есть выражение - при запросе - проскакиваем в БД мимо кэша." то есть, если это будет запрос, то он минуте кэш и смотреть в него не будет при методе find так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:08:34 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123Концепция - отсоединил и присоединил В ДРУГОЙ ТРАНЗАКЦИИ И ХИБЕР-СЕССИИ.Плохая концепция, так как сессия для этого не предназначена. Если приходится отсоединять/присоединять сессию - это очень большой повод задуматься о правильности решения. Ибо сессия должна жить в пределах срока жизни транзакции. Действие "внес какие-то изменения, но в базу не сохранил" - это не транзакция, это просто некое промежуточное действие пользователя. Последние два предложения - ключ к пониманию проблемы автора. Короче, попытка впихнуть невпихуемое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:09:40 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slippery, - странно, что Твой вариант даже никто не рассматривал. Т.е. это и есть самое простое решения и аналог длинных в РСУБД. Я впервую очередь надеюсь на него - Код: plaintext 1. 2. 3. 4. так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:14:03 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenomPetro123Концепция - отсоединил и присоединил В ДРУГОЙ ТРАНЗАКЦИИ И ХИБЕР-СЕССИИ.Плохая концепция, так как сессия для этого не предназначена. Если приходится отсоединять/присоединять сессию - это очень большой повод задуматься о правильности решения. Ибо сессия должна жить в пределах срока жизни транзакции. Действие "внес какие-то изменения, но в базу не сохранил" - это не транзакция, это просто некое промежуточное действие пользователя. Последние два предложения - ключ к пониманию проблемы автора. Короче, попытка впихнуть невпихуемое. попытка решить задачу минимальным написанием кода) ведь например кроме того, что вынимать объекты из памяти и фильтровать выборки, надо еще и хранить очередность вставки потом при "последнем" коммите. кстати насчет фильтрации выборок, это разработчикам закладок придется делать самим, руками, что тоже не есть гуд по моим требованием, я конечно понимаю, что условия моей задачи наталкивают на это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:17:53 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyто есть, если это будет запрос, то он минуте кэш и смотреть в него не будет при методе find так? не так. При автомате. - метод с Query будет 1) хибер сбросит в БД чтобы синхронизировать себя с БД. Он не дурак и видит что юзвер лезет в БД а не к нему. Я бы тоже так сделал. - метод Find \ Get ищет в оперативке и Хибер знает :) = flash() не делает. Логично? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:20:33 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slippery, - странно, что Твой вариант даже никто не рассматривал. Т.е. это и есть самое простое решения и аналог длинных в РСУБД. Я впервую очередь надеюсь на него - Код: plaintext 1. 2. 3. 4. так? да, задумка моя была именно такая и это работает на моем тестовом примере, что я попробовал, когда операция идет с 1 объектом, ну и возникают траблы когда вот надо контролировать связанные объекты, то есть фильтровать выборки объектов которые не связаны в entity отношением с редактируемым главным объектом(объект от которого начинаем плясать когда открываем визард) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:20:38 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slipperyто есть, если это будет запрос, то он минуте кэш и смотреть в него не будет при методе find так? не так. При автомате. - метод с Query будет 1) хибер сбросит в БД чтобы синхронизировать себя с БД. Он не дурак и видит что юзвер лезет в БД а не к нему. Я бы тоже так сделал. - метод Find \ Get ищет в оперативке и Хибер знает :) = flash() не делает. Логично? к примеру запрос: List users = session.find("from UserInfo as u where u.fullName = ?", "John Doe", Hibernate.STRING ); какая логика работы в данном случаи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:22:48 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
в смысле, что он будет искать в кеше, будет ли он искать в кеше и как он будет это делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:24:29 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slippery, если работает, то замечательно. Я выше написал по вкладкам. Если вкладка дала знать о необходимости перезапроса ВСЕМ (invalidate() в WinAPI :) ) это работает? Ты бы хотел запросы к Модели в оперативе-кэше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 19:24:46 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37614628&tid=2132841]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
274ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 364ms |
| total: | 765ms |

| 0 / 0 |
