powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate, работа с Session
25 сообщений из 156, страница 3 из 7
Hibernate, работа с Session
    #37613286
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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")
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613294
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczполучить функциональность Detached Data Se
именно! Я просто не хочу пока холивар. Есть некоторые мысли.
Сначала с ЕГО кодом разобраться.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613295
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аффтар!!! алё
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613298
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 Сначала с ЕГО кодом разобраться. Уже разобрались.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613303
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomPetro123 Сначала с ЕГО кодом разобраться. Уже разобрались.
цыц... :)
ты не автор, и у меня был вопрос.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613331
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123svenom2. Пример автора не работает, так как информация об удаленных/сохраненных объектах находится в кеше первого уровня и не был выполнен flush(), а HQL запрос лезет напрямую в базу, минуя кеш первого уровня.
===== покажите как лезть не в БД, а оперативку
Через кеш первого уровня и HQL запрос - никак. Вообще никак.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613348
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
предложение - подвопрос топика "несколько сессий и состояние"
тут
Флейм для пользы - Как хранить Состояние в 3-х звенке или Есть ли SpringСостояние?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613520
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 пользователя из мапа , а не двух.
Как быть в таком случаи????
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613537
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз уточню, что вкладки будут делать разные программисты, которым вникать в тонкости не нужно, для них весь механизм должен быть по возможности прозрачен.

И еще может у кого-нить есть хоть какие-то данные если использовать 1 большую транзакцию для решения этой проблемы. Насколько это "положит" систему если таких транзакций будет открыто параллельно ну к примеру 1000 или даже 10000??? Судя по тому сколько отжирет по памяти соединение с бд хранимое в пуле, мне становится страшно, вот почему долгие именно транзакции я не рассматривал, но возможно я не прав???
но вот открываю htop процессы, ит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров, сейчас штук 10 в пуле...а если их будет 10000
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613561
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот теперь вроде полностью описана задача с её проблемами, может кто-то решал нечто такое или идеи есть интересные как можно такое решить?)

на всякий случай еще раз скопирую описание задачи:

реализовать универсальный визард(карточку) для работы со всеми объектами системы. Для каждого объекта будут разные наборы закладок и определяться в зависимости от того какие интерфейсы реализует объект, для разных объектов могут использоваться одинаковые закладки, ну к примеру если объекты входят в систему безопасности, то для таких объектов будет вкладка «доступ». Переключения между вкладками может быть в произвольном порядке, а не в строгом, как у настоящего визарда.

Все изменения, что в нес пользователь на всех закладках в итоге нужно сохранить в базу в 1 транзакции предположительно последней. Создания вкладок по редактированию логически связанных объектов должны быть реализованы независимо друг от друга и прямой передачи данных между ними быть не должно.

Данные созданные на закладке с номером 1 должны быть видны(доступны) на закладке 2, причем закладка 2 разрабатывается с незнанием о закладки 1, поэтому данные должны выниматься для разработчика прозрачно к примеру через hql запрос, дополнительные варианты рассматриваются. То есть если на закладки 1 добавили пользователя, а на 2 закладки нужно работать с существующими пользователями, то пользователь добавленный на закладке 1 должен присутствовать в выборке полученной на второй закладке. Выборки на второй закладки будут с условиями, поэтому пользователи добавленные на закладки один попадают в выборку на закладке 2, если соотвествуют указанным условиям выборки.
Данные добавляемые на всех закладках не доступны другими пользователям или другим визардам, то есть если мы добавили какого-то пользователя, но не провели заключительного "комита" то этот пользователь не должен попадать в выборки в системе, кроме выборок того же визарда в котором пользователь добавлен
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613586
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача решается только через длинные транзакции. Как делать длинные транзакции в вебе, я не знаю. В соседнем треде svenom говорил, что для него это не проблема, может он вам поможет.
Я бы на вашем месте переработал ui.
ит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров, сейчас штук 10 в пуле...а если их будет 10000

Какие у вас значения work_mem и shared_buffers?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613597
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613604
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Йуный джавистЪЗадача решается только через длинные транзакции. Как делать длинные транзакции в вебе, я не знаю. В соседнем треде 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, но для каждой долго транзакции будет же свой процесс открыт
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613619
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyто в выборке его уже небыло бы, но увы, он там есть....
фигово.
Я так понял, это 1 кэш не синхро автоматом с БД?
А если руками flush?
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613625
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров
задай вопрос в субд - imho это ненормально.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613630
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪЗадача решается только через длинные транзакции. Как делать длинные транзакции в вебе, я не знаю. В соседнем треде svenom говорил, что для него это не проблема, может он вам поможет.
Я бы на вашем месте переработал ui.
ит каждый коннект к базе(у меня постгри) это отдельный процесс и жерт он по 300 метров, сейчас штук 10 в пуле...а если их будет 10000

Какие у вас значения work_mem и shared_buffers?Неверно, длинные транзакции тут не нужны, именно про это я и говорю.

Автор , вам отвечу вечером, тут надо просто много писать, сейчас времени на это нет. Ну то есть пофлеймить маленькими постами могу, а вот вдумчиво написать - попозже.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613637
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123slipperyто в выборке его уже небыло бы, но увы, он там есть....
фигово.
Я так понял, это 1 кэш не синхро автоматом с БД?
А если руками flush?

нет, я имел ввиду что в выборке он есть в моем случаи, когда я специально не делаю flush перед след запросом, мне по моей задаче нельзя его делать, мне его можно сделать только в самом конце, отсюда и проблема.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37613640
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svenomЙуный джавистЪЗадача решается только через длинные транзакции. Как делать длинные транзакции в вебе, я не знаю. В соседнем треде svenom говорил, что для него это не проблема, может он вам поможет.
Я бы на вашем месте переработал ui.
пропущено...

Какие у вас значения work_mem и shared_buffers?Неверно, длинные транзакции тут не нужны, именно про это я и говорю.

Автор , вам отвечу вечером, тут надо просто много писать, сейчас времени на это нет. Ну то есть пофлеймить маленькими постами могу, а вот вдумчиво написать - попозже.

спасибо, жду с нетерпением большого и вдумчивого совета
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614442
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public class Department {
    private Long id;
    private String name;
    private List<Employee> employees;
}

У вас будет вот такой DTO:
Код: java
1.
2.
3.
4.
public class DepartmentDTO {
    private Long id;
    private String name;
}

Обратите внимание, что у него нет поля employees. Это сделано сознательно, так как цель это DTO - отрендерить только департамент. При таком подходе вы не сможете выстрелить себе в ногу, столкнувшись с Lazy load.
2) Далее, возникает вопрос - ну а как мне получить теперь список сотрудников департамента? Очень легко - надо просто написать fine-grained сервисы, которые будут это делать.
То есть вместо:
Код: java
1.
2.
3.
public interface DepartmentService {
    public Department getById(Long id); // выдали Deaprtment с опасным неинициализированным полем employees
}

Сделать
Код: java
1.
2.
3.
4.
5.
6.
public interface DepartmentService {
    public DepartmentDTO getById(Long id);
}
public interface EmployeeService {
    public List<EmployeeDTO> getByDepartmentId(Long id);
}


3) Ок, интерфейсы спроектировали, теперь пишете их реализацию. В реализации надо решить вопрос, как мапить данные из сущностей на данные DTO. Можно руками перегонять, можно воспользоваться какой-нибудь библиотекой, типа commons beanutils.
4) Сервисы готовы, DTO готовы, вводим сессию сервелетов.
5) Далее, надо спроектировать контекст пользователя, в котором будут храниться данные обо всех внесенных им изменениях. За основу можете посмотреть на иходники класса ActionQueue в Хибере. То есть это будет что-то типа (пишу, что сходу в голову пришло):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// Общий контекст
public class UserContext {
    private Map<Class, ActionListBean> context;
    // какие-то методы на ваше усмотрение
}
// Тут храняться все изменения, внесенные пользователем в рамках конкретного класса
public class ActionListBean<ID, T> {
    private Map<ID, T> createActions;
    private Map<ID, T> saveActions;
    private List<ID> deleteActions;
}


6) Далее пишите контроллеры. Что они будут делать? Два действия - сначала лезут в соответствующий сервис, получают инофрмацию из БД, потом проверяют контекст на наличие изменений, применяют их, потому выдают моедль пользователю.
Пример - получения списка сотрудников департамента:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public List<Employees> getEmployeesByDeptId(Long deptId, Session session) {
    UserContext userContext = (UserContext)session.get(USER_CONTEXT);
    EmployeeService employeeService = // получили или заинжектили сервис
    List<Employees> employees = employeeService.getByDepartmentId(deptId);
    ActionListBean<Long, Employee> employeeActionList = userContext.get(Employee.class);
    List<Employees> actualEmployees = new ArrayList<Employees>();
    for (Employee employee : employees) {
        if (!employeeActionList.getDeleteActions().contains(employee.getId())) { 
            if (employeeActionList.getSaveActions().contains(employee.getId())) {
                // применили изменения
            }
        }
        actualEmployees.add(employee);
    }
    // а тут добавили к списку actualEmployees все, что есть в employeeActionList.getCreateActions()
    return actualEmployees;
}


7) Ну и, наконец, создаете контроллер, который будет сохранять в БД все, что есть в UserContext, когда пользователь желает сохранить изменения.
Все. Громоздко? Да. Но зато это правильный подход, который использует все сильные стороны ООП и вообще никак не зависит от всяких Lazy-загрузок и сессий хибера. Вам не надо детачить сессию и потом заново приаттачивать, вам не надо беспокоиться о длинных транзакциях - их тут просто нет, вам не надо беспокоиться о том, когда Хибер вздумает зафлашить что-то, и т.д..

Для тех, кто читает невнимательно или желает потроллить, повторюсь - это псевдокод, он не предназначен для использования. Его цель - только показать идею.

Второй важный момент. То, что я написал, это пример того, как делается "по уму". Но, к сожалению, коммерческое программирование это не академическая наука, а бизнес. И бизнес обязывает подстраиваться под него - под бюджет, под временные рамки, под политическую подковерную игру, под заморочки и тараканы определнных людей, и т.д.. Невозможно все всегда делать по уму - бизнес тупо не ползволяет. А поэтому надо всегда сначала формировать в голове правильное решение, а потом думать, несколько окружающая обстановка позволяет его применить. Если позволяет - отлично, применяем. Если не позволяет (сроки горят, менеджер задуплил по жесткому и т.д..), то надо подстраиваться под ситуацию, и, возможно, отказываться от правильного решения в пользу того, которое наиболее подойдет к конкретной ситуации.
Я кончил, сотрите с доски
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614452
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenom,
Спс. за титанический труд. Ты узнал, каково это публично выставлять код :)
Весь это метод действительно - академический. Он есть в сети, и также есть критика ОТ применения его в реальных проектах.
ЗЫ.
Оффтоп в моей теме рядом.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614459
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Спс. за титанический труд. Ты узнал, каково это публично выставлять код :)Вы о чем?

Petro123Весь это метод действительно - академический. Он есть в сети, и также есть критика ОТ применения его в реальных проектах.То, что я здесь показал - это помесь доменной модели с паттерном MVC. Если есть какие-то претензии к доменной модели или MVC - задавайте вопросы.
"Есть в сети" - это флейм чистой воды. Поел уже
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614462
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenom,
- я про то, что сильно жёстко критиковал код ShSerge.

off в моей теме рядом. У меня есть ещё один метод, попозже попрошу тебя проанализировать его.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614516
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- я про то, что сильно жёстко критиковал код ShSerge.Я не мог критиковать код ShSerge , так как он никакого кода не приводил в рамках того топика.
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614602
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svenom, огромное спасибо за ответ и ваш труд

Но в моем случаи к сожалению DTO не будет, увы в этом проекте в который я пришел, специально делали так чтоб PL общался напрямую с хибером, чтоб не плодить дто и не тратить время на конвертации, а также главное, чтоб иметь возможность в нужное время обращаться к лази полям и не писать отдельные запросы как вы привели в примере. В прошлом своем проекте, я как раз использовал схему что вы предложили, но тут уже никак.

1) далее: но ваш подход не решает или я посмотрел 1 проблемы, а конкретно добавление в выборку созданных сущностей: "но вот добавлять которых нет, уже не совсем ясно, ведь запросы могли быть по условиям, а не простой селект всех из списка, а если по условии то не факт, что в результат выборки нужно добавить все новые объекты получаемого типа из мапа, может быть только половина подходит.
к примеру на первой вкладке добавили двух пользователей с именами Петя, Вася. А на второй делаем запрос "найти всех пользователей чье имя начинается на П" тогда в эту выборку нужно добавить только 1 пользователя из мапа, а не двух. "

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

2) И еще, вы писали : "Теперь внимание - все HQL/SQL запросы, все критерии - НЕ ИДУТ через кэш первого уровня, они в него не смотрят. Они вытаскивают инормацию сразу из БД и только потом кладут ее в кеш. Поэтому, если вы что-то создали, но не сделали flush(), то нет никакого способа заставить ХИбер вытащить это через HQL запрос. Вообще никак."

но проведя эксперимент у меня получилось так:
get(A.class, 1);
исправил в нем какое-то поле
и после сделал так: createQuery("from A").list();
то в результате в списке объектов А будет объект с ид-1 с уже измененным значением поле. То есть хибер заменил объект из выборки на тот что хранится в памяти ну или смержил, внутренностей не знаю.


То есть получается что все же не минует кэш первого уровня, ведь измененный но еще не сохраненный в базу объект он подхватил из кэша! Почему в этом случаи это работает????
...
Рейтинг: 0 / 0
Hibernate, работа с Session
    #37614607
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще дополнение по второму вопросу: (по update объекты), то есть он кладет его в кэш и мержит с тем, что уже там есть, по правилу простой замены, типа тот что уже есть в кэше круче(новее/правильнее) берем его?
...
Рейтинг: 0 / 0
25 сообщений из 156, страница 3 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate, работа с Session
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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