|
|
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, отлично! Я тоже нашёл на твоём форуме - find () и авторА>Здравствуйте! А>Помогите разобраться с проблемой: А>есть метод А>@Transactional А>public XXX save(XXX xxx) { А> if (xxx.id != 0) { А> //надо прочитать этот же объект из базы А> XXX oldXXX = load(xxx.id); А> //опс!!!!!!! А> Assert.isFalse(xxx.equal(oldXXX)); А> } А>} А>@Transactional(propagation = Propagation.SUPPORTS) А>public load(int id) { А> //тупо селект А>} А>[/java] 1. flush before/after load 2. new InitialContext().lookup("jdbc/MyConn") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:31:04 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Blazkowiczполучить функциональность Detached Data Se именно! Я просто не хочу пока холивар. Есть некоторые мысли. Сначала с ЕГО кодом разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:32:35 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Аффтар!!! алё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:33:10 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123 Сначала с ЕГО кодом разобраться. Уже разобрались. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:34:19 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenomPetro123 Сначала с ЕГО кодом разобраться. Уже разобрались. цыц... :) ты не автор, и у меня был вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:36:03 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123svenom2. Пример автора не работает, так как информация об удаленных/сохраненных объектах находится в кеше первого уровня и не был выполнен flush(), а HQL запрос лезет напрямую в базу, минуя кеш первого уровня. ===== покажите как лезть не в БД, а оперативку Через кеш первого уровня и HQL запрос - никак. Вообще никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:49:39 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
предложение - подвопрос топика "несколько сессий и состояние" тут Флейм для пользы - Как хранить Состояние в 3-х звенке или Есть ли SpringСостояние? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 15:53:46 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenomВ общем, понял я вашу проблему. Есть два решения. Одно умное, правильное, но геморное. Второе топорное, кривое, но быстрее. Изначально проблема заключается в том, что вы пытаетесь переложить на сессию Хибера то, для чего она не предназначена. А именно - поддержание состояния работы пользователя между запросами. Так вот, этим должна заниматься не сессия Хибера, а сессия сервелета, а логика поддержания этого состояния должна поддерживаться вами вручную. 1) Правильное решение - писать код самому, который будет отслеживать изменения пользователя. Это будут скорее всего тупо POJO с минимумом логики и в основном геттерами - сеттерами. В итоге - для всех операций пользователя вы будете только считывать данные из БД, то есть открыли сессию Хибера, быстро считали, закрыли. И лишь последним действием - сохранением - вы переносите все изменения из сессии сервлета в сессию Хибера и комитите их. 2) Дерьмовое решение - полезть в непубличный API Хибера. То есть берете сессию, кастите ее до SessionImpl и начинаете копаться в потрохах Хибера. Примеры: а) вызвать sessionImpl.gtPersistenceContext() и порыться там; б) вызвать sessionImpl.getActionQueue(), потом через рефлекшн получить значения закрытых полей insertions/deleteions/updates и что-нибудь замутить с ними; в) вызвать sessionImpl.getListeners() и выставить своих листенеров на события. Но учтите, что пойдя вторым путем, вы испортите свою карму, совершив акт говнокодерства. Еще несколько таких проступков - и бессмертный дух говнокодерства поработит вас Автор тут) спасибо, svenom 1. Сессия хранит все что мы наделали если ее не закрывать, и в конце при ручном сбросе сохранит все изменения в бд. Так же уже проверил, что если к примеру я сделал выборку какого то элемента, так: get(A.class, 1); исправил в нем какое-то поле и после сделал так: createQuery("from A").list(); то в результате в списке объектов А будет объект с ид-1 с уже измененным значением поле. То есть хибер заменил объект из выборки на тот что хранится в памяти ну или смержил, внутренностей не знаю. Я надеялся, что также автоматически хибер сможет убрать и уже удаленные объекты, которые содержатся в сессии со статусом DELETE, то есть если бы я удалил объект А с ид-1: A a= get(A.class, 1); remove(a); createQuery("from A").list() то в выборке его уже небыло бы, но увы, он там есть.... 2. если идти по первому варианту, мне придется к примеру в мапе хранить все измененные(добавленные, удаленные, update-сам хибер контролирует судя по эксперименту) объекты, передавать мап между вкладками. В моем случаи пихать мап в сессию не нужно так как: используется zkoss, создается страница и ее контроллер, на страницу помещается компонент типа таббокса в котором и будут вкладки. Вкладки являются отдельными компонентами и помещаться в таббокс будут при создании страницы в зависимости от рассматриваемого объекта. ZKOSS сам поддерживает состояние объекта-контроллера в памяти для запросов от элементов находящихся на странице, то есть если я в контроллере укажу атрибутом какое-то поле, а потом на разных вкладках таббокса будут щелкать кнопки посылающие контроллеру запросы, то класс контроллера будет один и тот же и атрибут с указанным значением будет один и тот же и доступен всем компонентам(в данном случаи вкладкам). Поэтому мап, сессию или что-там еще могу хранить как атрибуты контроллера(каркаса/визарда) на котором и будут располагаться вкладки. Далее мне видимо придется при удалении или добавлении объекта на любой из вкладок, помещать его в этот мап . Ну, а далее мне придется фильтровать все выборки на вкладках руками, то есть получаем на какой-то вкладке createQuery("from A").list() и проверяем есть ли объекты типа А в мапе , ага есть, тогда фильтруем выборку, удалим те, что удалены и добавим тех что нет. Правильно ли я понял вашу идею? Если да, то тут минусы, ладно фильтровать удаленные объекты еще логично и понятно как, но вот добавлять которых нет, уже не совсем ясно, ведь запросы могли быть по условиям, а не простой селект всех из списка, а если по условии то не факт, что в результат выборки нужно добавить все новые объекты получаемого типа из мапа , может быть только половина подходит. к примеру на первой вкладке добавили двух пользователей с именами Петя, Вася. А на второй делаем запрос "найти всех пользователей чье имя начинается на П" тогда в эту выборку нужно добавить только 1 пользователя из мапа , а не двух. Как быть в таком случаи???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 16:48:43 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Еще раз уточню, что вкладки будут делать разные программисты, которым вникать в тонкости не нужно, для них весь механизм должен быть по возможности прозрачен. И еще может у кого-нить есть хоть какие-то данные если использовать 1 большую транзакцию для решения этой проблемы. Насколько это "положит" систему если таких транзакций будет открыто параллельно ну к примеру 1000 или даже 10000??? Судя по тому сколько отжирет по памяти соединение с бд хранимое в пуле, мне становится страшно, вот почему долгие именно транзакции я не рассматривал, но возможно я не прав??? но вот открываю htop процессы, ит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров, сейчас штук 10 в пуле...а если их будет 10000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 16:58:50 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Вот теперь вроде полностью описана задача с её проблемами, может кто-то решал нечто такое или идеи есть интересные как можно такое решить?) на всякий случай еще раз скопирую описание задачи: реализовать универсальный визард(карточку) для работы со всеми объектами системы. Для каждого объекта будут разные наборы закладок и определяться в зависимости от того какие интерфейсы реализует объект, для разных объектов могут использоваться одинаковые закладки, ну к примеру если объекты входят в систему безопасности, то для таких объектов будет вкладка «доступ». Переключения между вкладками может быть в произвольном порядке, а не в строгом, как у настоящего визарда. Все изменения, что в нес пользователь на всех закладках в итоге нужно сохранить в базу в 1 транзакции предположительно последней. Создания вкладок по редактированию логически связанных объектов должны быть реализованы независимо друг от друга и прямой передачи данных между ними быть не должно. Данные созданные на закладке с номером 1 должны быть видны(доступны) на закладке 2, причем закладка 2 разрабатывается с незнанием о закладки 1, поэтому данные должны выниматься для разработчика прозрачно к примеру через hql запрос, дополнительные варианты рассматриваются. То есть если на закладки 1 добавили пользователя, а на 2 закладки нужно работать с существующими пользователями, то пользователь добавленный на закладке 1 должен присутствовать в выборке полученной на второй закладке. Выборки на второй закладки будут с условиями, поэтому пользователи добавленные на закладки один попадают в выборку на закладке 2, если соотвествуют указанным условиям выборки. Данные добавляемые на всех закладках не доступны другими пользователям или другим визардам, то есть если мы добавили какого-то пользователя, но не провели заключительного "комита" то этот пользователь не должен попадать в выборки в системе, кроме выборок того же визарда в котором пользователь добавлен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:09:19 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Задача решается только через длинные транзакции. Как делать длинные транзакции в вебе, я не знаю. В соседнем треде svenom говорил, что для него это не проблема, может он вам поможет. Я бы на вашем месте переработал ui. ит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров, сейчас штук 10 в пуле...а если их будет 10000 Какие у вас значения work_mem и shared_buffers? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:20:27 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪЗадача решается только через длинные транзакции. Как делать длинные транзакции в вебе, я не знаю. В соседнем треде svenom говорил, что для него это не проблема, может он вам поможет. Я бы на вашем месте переработал ui. ит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров, сейчас штук 10 в пуле...а если их будет 10000 Какие у вас значения work_mem и shared_buffers? USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command postgres 20 0 101M 3736 1648 S 0.0 0.1 0:00.01 | `- postgres: 127.0.0.1(49534) idle и вот таких сейчас штук 10, но для каждой долго транзакции будет же свой процесс открыт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:27:29 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyто в выборке его уже небыло бы, но увы, он там есть.... фигово. Я так понял, это 1 кэш не синхро автоматом с БД? А если руками flush? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:32:55 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slipperyит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров задай вопрос в субд - imho это ненормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:34:53 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪЗадача решается только через длинные транзакции. Как делать длинные транзакции в вебе, я не знаю. В соседнем треде svenom говорил, что для него это не проблема, может он вам поможет. Я бы на вашем месте переработал ui. ит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров, сейчас штук 10 в пуле...а если их будет 10000 Какие у вас значения work_mem и shared_buffers?Неверно, длинные транзакции тут не нужны, именно про это я и говорю. Автор , вам отвечу вечером, тут надо просто много писать, сейчас времени на это нет. Ну то есть пофлеймить маленькими постами могу, а вот вдумчиво написать - попозже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:36:34 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123slipperyто в выборке его уже небыло бы, но увы, он там есть.... фигово. Я так понял, это 1 кэш не синхро автоматом с БД? А если руками flush? нет, я имел ввиду что в выборке он есть в моем случаи, когда я специально не делаю flush перед след запросом, мне по моей задаче нельзя его делать, мне его можно сделать только в самом конце, отсюда и проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:38:14 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenomЙуный джавистЪЗадача решается только через длинные транзакции. Как делать длинные транзакции в вебе, я не знаю. В соседнем треде svenom говорил, что для него это не проблема, может он вам поможет. Я бы на вашем месте переработал ui. пропущено... Какие у вас значения work_mem и shared_buffers?Неверно, длинные транзакции тут не нужны, именно про это я и говорю. Автор , вам отвечу вечером, тут надо просто много писать, сейчас времени на это нет. Ну то есть пофлеймить маленькими постами могу, а вот вдумчиво написать - попозже. спасибо, жду с нетерпением большого и вдумчивого совета ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:39:29 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
slippery1. Сессия хранит все что мы наделали если ее не закрывать, и в конце при ручном сбросе сохранит все изменения в бд. Так же уже проверил, что если к примеру я сделал выборку какого то элемента, так: get(A.class, 1); исправил в нем какое-то поле и после сделал так: createQuery("from A").list(); то в результате в списке объектов А будет объект с ид-1 с уже измененным значением поле. То есть хибер заменил объект из выборки на тот что хранится в памяти ну или смержил, внутренностей не знаю. Я надеялся, что также автоматически хибер сможет убрать и уже удаленные объекты, которые содержатся в сессии со статусом DELETE, то есть если бы я удалил объект А с ид-1: A a= get(A.class, 1); remove(a); createQuery("from A").list() то в выборке его уже небыло бы, но увы, он там есть....Итак. Тут расскажу только про рабоут сессий. По решению вашей проблемы ниже. Есть кеш первого уровня. Его скоуп - сессия. В него кладутся все объекты, с которыми вы работали - все, что создали и сохранили, все что вытащили черезе запрос или через load/get. Теперь внимание - все HQL/SQL запросы, все критерии - НЕ ИДУТ через кэш первого уровня, они в него не смотрят . Они вытаскивают инормацию сразу из БД и только потом кладут ее в кеш. Поэтому, если вы что-то создали, но не сделали flush(), то нет никакого способа заставить ХИбер вытащить это через HQL запрос. Вообще никак. slippery2. если идти по первому варианту, мне придется к примеру в мапе хранить все измененные(добавленные, удаленные, update-сам хибер контролирует судя по эксперименту) объекты, передавать мап между вкладками. В моем случаи пихать мап в сессию не нужно так как: используется zkoss, создается страница и ее контроллер, на страницу помещается компонент типа таббокса в котором и будут вкладки. Вкладки являются отдельными компонентами и помещаться в таббокс будут при создании страницы в зависимости от рассматриваемого объекта. ZKOSS сам поддерживает состояние объекта-контроллера в памяти для запросов от элементов находящихся на странице, то есть если я в контроллере укажу атрибутом какое-то поле, а потом на разных вкладках таббокса будут щелкать кнопки посылающие контроллеру запросы, то класс контроллера будет один и тот же и атрибут с указанным значением будет один и тот же и доступен всем компонентам(в данном случаи вкладкам). Поэтому мап, сессию или что-там еще могу хранить как атрибуты контроллера(каркаса/визарда) на котором и будут располагаться вкладки. Далее мне видимо придется при удалении или добавлении объекта на любой из вкладок, помещать его в этот мап . Ну, а далее мне придется фильтровать все выборки на вкладках руками, то есть получаем на какой-то вкладке createQuery("from A").list() и проверяем есть ли объекты типа А в мапе , ага есть, тогда фильтруем выборку, удалим те, что удалены и добавим тех что нет. Правильно ли я понял вашу идею? Если да, то тут минусы, ладно фильтровать удаленные объекты еще логично и понятно как, но вот добавлять которых нет, уже не совсем ясно, ведь запросы могли быть по условиям, а не простой селект всех из списка, а если по условии то не факт, что в результат выборки нужно добавить все новые объекты получаемого типа из мапа , может быть только половина подходит. к примеру на первой вкладке добавили двух пользователей с именами Петя, Вася. А на второй делаем запрос "найти всех пользователей чье имя начинается на П" тогда в эту выборку нужно добавить только 1 пользователя из мапа , а не двух. Как быть в таком случаи????В общем случае в приложении есть слой работы с БД - DAL, есть доменная модель - это часто тупо Entity-бины, есть сервисный слой - это либо те же Entity-бины (Rich Domain Model), либо это отдельные объекты (напр, EJB), которые оперируют над объектами доменной модели. И, наконец, есть слой презентации. Так вот, в общем случае слой презентации не видит доменную модель, он не видит сущностей, он общается с сервисным слоем через определенный интерфейс и получают от него не сущности, а DTO - data transfer object. DTO - это специальные объекты, которые используются только для того, что бы быть переданы клиенты, все. Итого, мы получаем такую схему: [СУБД] - [DAL -0 Entity )- SL -0 DTO )- PL] -0 - это интерфейс )- - это потребитель интерфейса То есть, Service Layer обращается к DAL, получает Entity. Presentation обращается к интерфейсам Service Layer, получает DTO. DTO являются моделью, которые рендерятся на веб-странице. Но это общий случаи, реальность может значительно от него отличаться. Рассматриваем ваш случаи. У вас он выглядит вот так: [СУБД] - [DAL -0 Entity )- SL -0 Entity )- PL] То есть PL общается с SL и получает обратно не готовую модель в виде DTO, а получает сущности. Из этого сразу следует несколько проблем: 1) Вы связываетесь с сессией Хибера. 2) Вам приходится разруливать всякие проблемы с Lazy load. Что надо сделать, что бы решить эти проблемы? Вам надо полностью отделить PL от Хибера, полностью. Что бы он вообще не знал, что Хибер есть в проекте. 1) Вы вводите слой DTO объектов. С большой вероятностью, они будут повторять структуру ваших сущностей, но в них не будет зависимостей. То есть вместо сущности Department: Код: java 1. 2. 3. 4. 5. У вас будет вот такой DTO: Код: java 1. 2. 3. 4. Обратите внимание, что у него нет поля employees. Это сделано сознательно, так как цель это DTO - отрендерить только департамент. При таком подходе вы не сможете выстрелить себе в ногу, столкнувшись с Lazy load. 2) Далее, возникает вопрос - ну а как мне получить теперь список сотрудников департамента? Очень легко - надо просто написать fine-grained сервисы, которые будут это делать. То есть вместо: Код: java 1. 2. 3. Сделать Код: java 1. 2. 3. 4. 5. 6. 3) Ок, интерфейсы спроектировали, теперь пишете их реализацию. В реализации надо решить вопрос, как мапить данные из сущностей на данные DTO. Можно руками перегонять, можно воспользоваться какой-нибудь библиотекой, типа commons beanutils. 4) Сервисы готовы, DTO готовы, вводим сессию сервелетов. 5) Далее, надо спроектировать контекст пользователя, в котором будут храниться данные обо всех внесенных им изменениях. За основу можете посмотреть на иходники класса ActionQueue в Хибере. То есть это будет что-то типа (пишу, что сходу в голову пришло): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 6) Далее пишите контроллеры. Что они будут делать? Два действия - сначала лезут в соответствующий сервис, получают инофрмацию из БД, потом проверяют контекст на наличие изменений, применяют их, потому выдают моедль пользователю. Пример - получения списка сотрудников департамента: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 7) Ну и, наконец, создаете контроллер, который будет сохранять в БД все, что есть в UserContext, когда пользователь желает сохранить изменения. Все. Громоздко? Да. Но зато это правильный подход, который использует все сильные стороны ООП и вообще никак не зависит от всяких Lazy-загрузок и сессий хибера. Вам не надо детачить сессию и потом заново приаттачивать, вам не надо беспокоиться о длинных транзакциях - их тут просто нет, вам не надо беспокоиться о том, когда Хибер вздумает зафлашить что-то, и т.д.. Для тех, кто читает невнимательно или желает потроллить, повторюсь - это псевдокод, он не предназначен для использования. Его цель - только показать идею. Второй важный момент. То, что я написал, это пример того, как делается "по уму". Но, к сожалению, коммерческое программирование это не академическая наука, а бизнес. И бизнес обязывает подстраиваться под него - под бюджет, под временные рамки, под политическую подковерную игру, под заморочки и тараканы определнных людей, и т.д.. Невозможно все всегда делать по уму - бизнес тупо не ползволяет. А поэтому надо всегда сначала формировать в голове правильное решение, а потом думать, несколько окружающая обстановка позволяет его применить. Если позволяет - отлично, применяем. Если не позволяет (сроки горят, менеджер задуплил по жесткому и т.д..), то надо подстраиваться под ситуацию, и, возможно, отказываться от правильного решения в пользу того, которое наиболее подойдет к конкретной ситуации. Я кончил, сотрите с доски ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 14:09:15 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom, Спс. за титанический труд. Ты узнал, каково это публично выставлять код :) Весь это метод действительно - академический. Он есть в сети, и также есть критика ОТ применения его в реальных проектах. ЗЫ. Оффтоп в моей теме рядом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 14:23:26 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123Спс. за титанический труд. Ты узнал, каково это публично выставлять код :)Вы о чем? Petro123Весь это метод действительно - академический. Он есть в сети, и также есть критика ОТ применения его в реальных проектах.То, что я здесь показал - это помесь доменной модели с паттерном MVC. Если есть какие-то претензии к доменной модели или MVC - задавайте вопросы. "Есть в сети" - это флейм чистой воды. Поел уже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 14:37:10 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom, - я про то, что сильно жёстко критиковал код ShSerge. off в моей теме рядом. У меня есть ещё один метод, попозже попрошу тебя проанализировать его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 14:44:47 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
Petro123- я про то, что сильно жёстко критиковал код ShSerge.Я не мог критиковать код ShSerge , так как он никакого кода не приводил в рамках того топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 15:49:33 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
svenom, огромное спасибо за ответ и ваш труд Но в моем случаи к сожалению DTO не будет, увы в этом проекте в который я пришел, специально делали так чтоб PL общался напрямую с хибером, чтоб не плодить дто и не тратить время на конвертации, а также главное, чтоб иметь возможность в нужное время обращаться к лази полям и не писать отдельные запросы как вы привели в примере. В прошлом своем проекте, я как раз использовал схему что вы предложили, но тут уже никак. 1) далее: но ваш подход не решает или я посмотрел 1 проблемы, а конкретно добавление в выборку созданных сущностей: "но вот добавлять которых нет, уже не совсем ясно, ведь запросы могли быть по условиям, а не простой селект всех из списка, а если по условии то не факт, что в результат выборки нужно добавить все новые объекты получаемого типа из мапа, может быть только половина подходит. к примеру на первой вкладке добавили двух пользователей с именами Петя, Вася. А на второй делаем запрос "найти всех пользователей чье имя начинается на П" тогда в эту выборку нужно добавить только 1 пользователя из мапа, а не двух. " Причем так как задача у меня стоит написать универсальный визард, то условий я не знаю заранее, имеется ли хорошее решения этой проблемы и если да, то какое???? 2) И еще, вы писали : "Теперь внимание - все HQL/SQL запросы, все критерии - НЕ ИДУТ через кэш первого уровня, они в него не смотрят. Они вытаскивают инормацию сразу из БД и только потом кладут ее в кеш. Поэтому, если вы что-то создали, но не сделали flush(), то нет никакого способа заставить ХИбер вытащить это через HQL запрос. Вообще никак." но проведя эксперимент у меня получилось так: get(A.class, 1); исправил в нем какое-то поле и после сделал так: createQuery("from A").list(); то в результате в списке объектов А будет объект с ид-1 с уже измененным значением поле. То есть хибер заменил объект из выборки на тот что хранится в памяти ну или смержил, внутренностей не знаю. То есть получается что все же не минует кэш первого уровня, ведь измененный но еще не сохраненный в базу объект он подхватил из кэша! Почему в этом случаи это работает???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:19:28 |
|
||
|
Hibernate, работа с Session
|
|||
|---|---|---|---|
|
#18+
и еще дополнение по второму вопросу: (по update объекты), то есть он кладет его в кэш и мержит с тем, что уже там есть, по правилу простой замены, типа тот что уже есть в кэше круче(новее/правильнее) берем его? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 18:24:05 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37613597&tid=2132841]: |
0ms |
get settings: |
17ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
371ms |
get topic data: |
19ms |
get forum data: |
5ms |
get page messages: |
100ms |
get tp. blocked users: |
3ms |
| others: | 357ms |
| total: | 894ms |

| 0 / 0 |
