|
|
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
2/ если ты не пойдёшь по методу 2, то как ты будешь присоединять к транзакции отложенную подгрузку объектов? Ты же не всё на вкладках будешь грузить на первый рендеринг страницы? Типа AJAX? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 09:58:48 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123хотя ты наверно имел ввиду - по БЛ блокируется ВСЯ информация ограниченная кнопкой Редактировать, а технически это можно сделать Одной блокировкой заказчика. Тогда ОК да именно это я и имел ввиду, но вопрос остается открытым, то есть сделав так: MObject obj1 = new MObject(); MObject obj2 = new MObject(); session.saveOrUpdate(obj1); session.saveOrUpdate(obj2); а потом вот так List list = session.createQuery("from Mobject").list(); я не получу 2 дабавленных объекта, то есть 2 добавленных заказа и аналогично если я удалю пару заказов из списка и снова запрошу список заказов, то удаленные заказы снова придут в результат. Так вот как можно сделать так, чтоб удаленные в этой сессии заказы не попадали в выборку??? Ну и как чтоб попадали добавленные? Сейчас это главная проблема для меня, которую я не знаю как оптимально решить.......очень жду советов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 11:55:05 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro1232/ если ты не пойдёшь по методу 2, то как ты будешь присоединять к транзакции отложенную подгрузку объектов? Ты же не всё на вкладках будешь грузить на первый рендеринг страницы? Типа AJAX? так объект в сессии, а сессия не закрывается, я начинаю новую транзакцию и дергаю у этого объекта лази поле и все и в конце закрываю транзакцию. Или если мне еще нужны данные то просто тоже в этой же сессии открываю транзакцию подгружаю данные которые попадают в сессию и закрываю транзакцию. Делаю я это при следующих обращениях к другим вкладкам, это в теории я еще не все успел попробовать. Или я не так понял вопроса? меня сейчас более волнует как решить вопросы заданные мной в предыдущем посту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 11:59:09 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Еще раз - запрос на то и запрос, что бы быть отправленным в БД. Есть в БД записей нету, то вы никак не можете их вернуть через запрос. Никак. Надо делать flush(), точка. Если flush() делать нельзя, ок - тогда пересматривайте свой подход в целом, так как ваша проблема звучит уж очень надуманной и высосанной из пальца. Опишите подробнее решаемую задачу - постараемся что-нибудь посоветовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 12:05:09 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom, разве при выкл. 2 кэше нужно делать session.flush? Сброс в БД не автоматом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 12:36:01 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123svenom, разве при выкл. 2 кэше нужно делать session.flush? session.flush() сбрасывает кэш 1го уровня - саму сессию. кэш второго уровня к этому отношения не имеет. Petro123Сброс в БД не автоматом? Это отдельная фича. Если понять персистент объект в транзакции, то при коммите транзакции хибер сохранит состояние в БД автоматом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 12:40:55 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, ок. Самый простой вариант: - session.flush - закрыть сессию Без ОБОИХ строк в БД будет пусто? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 12:48:33 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
я просто думал, что 1 уровень всегда синхрон с БД, если общаться исключ. через хибер. Типо автокоммита. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 12:50:04 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
В общем, понял я вашу проблему. Есть два решения. Одно умное, правильное, но геморное. Второе топорное, кривое, но быстрее. Изначально проблема заключается в том, что вы пытаетесь переложить на сессию Хибера то, для чего она не предназначена. А именно - поддержание состояния работы пользователя между запросами. Так вот, этим должна заниматься не сессия Хибера, а сессия сервелета, а логика поддержания этого состояния должна поддерживаться вами вручную. 1) Правильное решение - писать код самому, который будет отслеживать изменения пользователя. Это будут скорее всего тупо POJO с минимумом логики и в основном геттерами - сеттерами. В итоге - для всех операций пользователя вы будете только считывать данные из БД, то есть открыли сессию Хибера, быстро считали, закрыли. И лишь последним действием - сохранением - вы переносите все изменения из сессии сервлета в сессию Хибера и комитите их. 2) Дерьмовое решение - полезть в непубличный API Хибера. То есть берете сессию, кастите ее до SessionImpl и начинаете копаться в потрохах Хибера. Примеры: а) вызвать sessionImpl.gtPersistenceContext() и порыться там; б) вызвать sessionImpl.getActionQueue(), потом через рефлекшн получить значения закрытых полей insertions/deleteions/updates и что-нибудь замутить с ними; в) вызвать sessionImpl.getListeners() и выставить своих листенеров на события. Но учтите, что пойдя вторым путем, вы испортите свою карму, совершив акт говнокодерства. Еще несколько таких проступков - и бессмертный дух говнокодерства поработит вас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 12:57:34 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123я просто думал, что 1 уровень всегда синхрон с БД, если общаться исключ. через хибер. Типо автокоммита. ?Это настриваемо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 12:57:59 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123 Самый простой вариант: - session.flush - закрыть сессию Без ОБОИХ строк в БД будет пусто? Зависит от управления транзакциями. В нормальном случае ничего делать не нужно. Вот пример апдейт метода: Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 13:08:16 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Аффтар держись. Счас у тебя будет куча решений.:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 13:37:55 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom мы пока отвлеклись от вопроса. Если будем писать так много, то будет опять флейм "как хранить состояние с ОРМ" :) BlazkowiczВ нормальном случае ничего делать не нужно я тоже про это. 1 кэш это технический кэш. Он не может быть рассогласован. Вопрос: - кто даст пример и - почему выше код не работает? ЗЫ. там нет старт транзакции, но думаю это не нужно пока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 14:23:18 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123 , Причина проблемы озвучена выше, решение озвучено выше. Читайте внимательнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 14:32:23 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
OK svenomЭто настриваемо. уточни, если не трудно, где и как Аффтар ! твой код не работает в одной сессии хибера? Т.е. сделай пример с "Session-Per-Request" Одна сессия хибера на одну реквеста. Несколько реквестов (состояние) потом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 14:38:34 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123OK svenomЭто настриваемо. уточни, если не трудно, где и как session.setFlushMode(FlushMode.???); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 14:43:57 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom, лучше так: авторбольшинству приложений редко нужно указывать flush() явно.... FlushMode.AUTO – по умолчанию. с этим Flush выяснили - указывать не надо (пока) Вопрос про код выше остался. ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 14:52:14 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Сформулируйте вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 14:52:46 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123Вопрос: - кто даст пример для одной сессии и - почему выше код автора не работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 14:54:46 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
1. Пример чего надо привести? 2. Пример автора не работает, так как информация об удаленных/сохраненных объектах находится в кеше первого уровня и не был выполнен flush(), а HQL запрос лезет напрямую в базу, минуя кеш первого уровня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:01:10 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom1. Пример чего надо привести? ==== рабочий пример с настройками по умолчанию. Желательно без flush 2. Пример автора не работает, так как информация об удаленных/сохраненных объектах находится в кеше первого уровня и не был выполнен flush(), а HQL запрос лезет напрямую в базу, минуя кеш первого уровня. ===== покажите как лезть не в БД, а оперативку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:05:24 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123===== покажите как лезть не в БД, а оперативку [/quot] new HashSet(list).put(obj1); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:12:17 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, ммммм. вы профи, но вы так кратки ) Как вставить объект в сессию и прочитать из сессии-оперативы? Или добавьте свой код к коду автора? session.saveOrUpdate(obj2); опять достать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:18:24 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123session.saveOrUpdate(obj2); опять достать? Не поверишь. session.get() вернет obj2 без сбрасывания всего кэша в базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:25:49 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Вообще складывается впечатление, что автор из ORM пытается получить функциональность Detached Data Set. Хибернейт не умеет рабоать в оффлайне, накапливая изменения, чтобы потом их все сбросить. Если для каких-либо операций ему нужно будет получить акутальное состояние из базы, он сам сессию зафлашит, без явного вызова session.flush() Поэтому если изменения надо накапливать, это стоит делать отдельным инструментом а не самой сессией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:29:49 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37613155&tid=2132841]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 330ms |
| total: | 468ms |

| 0 / 0 |
