powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate, работа с Session
25 сообщений из 156, страница 4 из 7
Hibernate, работа с Session
    #37614613
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
IMHO
п.1
универсальный, значит он ничего не знает о содержании контейнерных вкладок и транзакциях в них.
Из этого вытекает, что при нажатии Сохранить на родителе вкладок происходит сброс в БД и переоткрытие всех вкладок.
Соответственно, при изменении связанных сущностей на вкладке А, при переходе на вкл. Б нужно либо спросить (Обновить\Не обновлять?) либо останутся старые данные.
Это надо уточнить и закрепить в ТЗ у заказчика.
Иначе будет слишком сильная кастомизация меньше универсализм.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614616
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
п.2
11900154
- get find - лезет в БД через кэш
- любой SQL запрос сначала делает flush, а потом сам запрос.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614619
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно ещё доавтоматизировать - в классе Вкладка поставить флаг "Требуется перезапрос модели". Если не читал, а Редактировал, то проставить. При смене вкладки Родитель опросит её.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614624
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyв нужное время обращаться к лази полям
да.
т.е. в динамике подгрузить их при отдаче в VIEW? или просто чохом все когда достали из ОРМ? (бывает так делают рекурсивно :) )
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614627
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 сессию Хибера и теперь мучаетесь с ней.
Выхода только два - либо идти моим путем и делать все по уму, либо придумывать всякие велосипедные или неестественные решения (например, как я привел выше - лезть в потроха Хибера). Третьего не дано.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614628
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- любой SQL запрос сначала делает flush, а потом сам запрос.Неверно. Никакого flush() не происходит. То есть, правильнее - it depends. В случае автора - с отключенным автоматическим flush(), его не будет.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614629
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyи еще дополнение по второму вопросу: (по update объекты), то есть он кладет его в кэш и мержит с тем, что уже там есть, по правилу простой замены, типа тот что уже есть в кэше круче(новее/правильнее) берем его?Сессионный "круче" по дефолту. Но это, скорее всего, можно как-то регулировать. Может быть - setCacheMode() поможет, может еще как.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614631
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomPetro123- любой SQL запрос сначала делает flush, а потом сам запрос.Неверно. Никакого flush() не происходит. То есть, правильнее - it depends. В случае автора - с отключенным автоматическим flush(), его не будет.
давай так:
- по умолчанию (если не отключал) - верно
- если отключил, то я читал что flush он падла и иногда делает :). Ты можешь поручиться что он сам ни разу не сбросит?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614634
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomТретьего не дано.
эх... молодость...категоричность
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614635
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123- get find - лезет в БД через кэш
.

а можно про это подробнее в каком смысле в БД через кэш?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614636
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomslipperyи еще дополнение по второму вопросу: (по update объекты), то есть он кладет его в кэш и мержит с тем, что уже там есть, по правилу простой замены, типа тот что уже есть в кэше круче(новее/правильнее) берем его?Сессионный "круче" по дефолту. Но это, скорее всего, можно как-то регулировать. Может быть - setCacheMode() поможет, может еще как.
перед тем как положить "пометить что он круче".
Merge "если не в курсе" и более долгий\затратный
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614638
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyPetro123- get find - лезет в БД через кэш
.
а можно про это подробнее в каком смысле в БД через кэш?
любой кэш может быть пустой. Есть объект - берём. Т.е. сначала в кэш - буквально.
Есть выражение - при запросе - проскакиваем в БД мимо кэша.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614639
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PEtro123- по умолчанию (если не отключал) - верноХз, надо тестировать. В случае SQL запроса - уверен на 95%, что это не так. По поводу HQL - просто сильно сомневаюсь.
Petro123- если отключил, то я читал что flush он падла и иногда делает :). Ты можешь поручиться что он сам ни разу не сбросит?Я не могу поручаться за чужой код. Откройте исходники и посмотрите.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614640
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123svenomТретьего не дано.
эх... молодость...категоричность Ждем от вас других вариантов решения. Мои два по сути звучат так: либо дальше мучаться от неправильного решения, принятого ранее, либо же заменить его на правильное.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614641
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аффтар! У меня к тебе вопрос:
- ты вроде хотел решить задачку методом "оттягивая flush() до конца".
- отказался?
У меня пока такая инфа, что хибер может сбросить сам, несмотря на ручной флаг.
Т.е. это не метод для решения.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614644
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenom,
я тебе назвал вариант, ты про него только - давай код.
Это не так скоро.
Концепция - отсоединил и присоединил В ДРУГОЙ ТРАНЗАКЦИИ И ХИБЕР-СЕССИИ.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614646
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123аффтар! У меня к тебе вопрос:
- ты вроде хотел решить задачку методом "оттягивая flush() до конца".
- отказался?
У меня пока такая инфа, что хибер может сбросить сам, несмотря на ручной флаг.
Т.е. это не метод для решения.

у меня такой инфы нет, пока остаюсь на этот варианте, если вдруг найдете доказательство сообщите пожалуйста, в моем эксперименте сброса не было, но он не претендует на 100 процентную истину

svenom, не могу я поменять архитектуру, придется многое переписать и изменить, а как вы говорили ранее бизнес есть бизнес и такую потерю времени мне не разрешат, так что надо найти наиболее красивое решение с учетом данного момента.

Petro123, вы писали:
"любой кэш может быть пустой. Есть объект - берём. Т.е. сначала в кэш - буквально.
Есть выражение - при запросе - проскакиваем в БД мимо кэша."

то есть, если это будет запрос, то он минуте кэш и смотреть в него не будет при методе find так?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614647
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Концепция - отсоединил и присоединил В ДРУГОЙ ТРАНЗАКЦИИ И ХИБЕР-СЕССИИ.Плохая концепция, так как сессия для этого не предназначена. Если приходится отсоединять/присоединять сессию - это очень большой повод задуматься о правильности решения. Ибо сессия должна жить в пределах срока жизни транзакции. Действие "внес какие-то изменения, но в базу не сохранил" - это не транзакция, это просто некое промежуточное действие пользователя. Последние два предложения - ключ к пониманию проблемы автора.
Короче, попытка впихнуть невпихуемое.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614650
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
- странно, что Твой вариант даже никто не рассматривал. Т.е. это и есть самое простое решения и аналог длинных в РСУБД.
Я впервую очередь надеюсь на него -

Код: plaintext
1.
2.
3.
4.
СНИМОК ОРМ
========
- вкл.ручной режим flush() на старте длинной БТ
- корочим как хотим Модель
- на конец БТ либо flush либо вернуть кэш в исходный персистент.

так?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614659
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svenomPetro123Концепция - отсоединил и присоединил В ДРУГОЙ ТРАНЗАКЦИИ И ХИБЕР-СЕССИИ.Плохая концепция, так как сессия для этого не предназначена. Если приходится отсоединять/присоединять сессию - это очень большой повод задуматься о правильности решения. Ибо сессия должна жить в пределах срока жизни транзакции. Действие "внес какие-то изменения, но в базу не сохранил" - это не транзакция, это просто некое промежуточное действие пользователя. Последние два предложения - ключ к пониманию проблемы автора.
Короче, попытка впихнуть невпихуемое.

попытка решить задачу минимальным написанием кода) ведь например кроме того, что вынимать объекты из памяти и фильтровать выборки, надо еще и хранить очередность вставки потом при "последнем" коммите.

кстати насчет фильтрации выборок, это разработчикам закладок придется делать самим, руками, что тоже не есть гуд по моим требованием, я конечно понимаю, что условия моей задачи наталкивают на это.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614664
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyто есть, если это будет запрос, то он минуте кэш и смотреть в него не будет при методе find так?
не так.
При автомате.
- метод с Query будет 1) хибер сбросит в БД чтобы синхронизировать себя с БД. Он не дурак и видит что юзвер лезет в БД а не к нему. Я бы тоже так сделал.
- метод Find \ Get ищет в оперативке и Хибер знает :) = flash() не делает.
Логично?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614665
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123slippery,
- странно, что Твой вариант даже никто не рассматривал. Т.е. это и есть самое простое решения и аналог длинных в РСУБД.
Я впервую очередь надеюсь на него -

Код: plaintext
1.
2.
3.
4.
СНИМОК ОРМ
========
- вкл.ручной режим flush() на старте длинной БТ
- корочим как хотим Модель
- на конец БТ либо flush либо вернуть кэш в исходный персистент.

так?

да, задумка моя была именно такая и это работает на моем тестовом примере, что я попробовал, когда операция идет с 1 объектом, ну и возникают траблы когда вот надо контролировать связанные объекты, то есть фильтровать выборки объектов которые не связаны в entity отношением с редактируемым главным объектом(объект от которого начинаем плясать когда открываем визард)
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614666
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123slipperyто есть, если это будет запрос, то он минуте кэш и смотреть в него не будет при методе find так?
не так.
При автомате.
- метод с Query будет 1) хибер сбросит в БД чтобы синхронизировать себя с БД. Он не дурак и видит что юзвер лезет в БД а не к нему. Я бы тоже так сделал.
- метод Find \ Get ищет в оперативке и Хибер знает :) = flash() не делает.
Логично?

к примеру запрос:
List users =
session.find("from UserInfo as u where u.fullName = ?",
"John Doe",
Hibernate.STRING
);


какая логика работы в данном случаи?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614667
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в смысле, что он будет искать в кеше, будет ли он искать в кеше и как он будет это делать?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614668
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
если работает, то замечательно.
Я выше написал по вкладкам.
Если вкладка дала знать о необходимости перезапроса ВСЕМ (invalidate() в WinAPI :) ) это работает?
Ты бы хотел запросы к Модели в оперативе-кэше?
...
Рейтинг: 0 / 0
25 сообщений из 156, страница 4 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate, работа с Session
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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