powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + Axis
11 сообщений из 11, страница 1 из 1
Hibernate + Axis
    #33439227
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть вэб-сервис, на базе Axis. Сервис предоставляет методы типа getObjectById, getAllObjects, updateObject, deleteObject и т д.

Когда клиенты (GUI) вызывают один из этих методов сервиса, в таком методе сначала открывается Hibernate-сессия, начинается транзакция, в контексте которой выполняется та или иная операция с БД - если все ок - транзакция коммитится, эксепшен - откатывается. В конце работы метода Hibernate-сессия закрывается.

Т е, при каждом вызове одно из таких методов приходиться открывать сессию, а в конце метода закрывать.

А возможно ли сделать так, чтобы при первом обращении клиента к веб-сервису для него создавалась отдельная Hibernate-сессия, в контексте которой и происходили бы вызовы всех этих методов. А когда клиент отсоединяется от сервера - эта сессия закрывалась бы.
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33439291
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень плохое решение. Открывать / закрывать сессии на каждый запрос в большинстве случаев дешевле, чем держать кучу ждущих соединений. Сессия открывается легко - всего и делов-то только взять из пула соединение.
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33439299
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду, что каждая ждущая сессия будет у Вас держать свое соединение. Если же Вы будете в начале обработки запроса подключать сессию ( reconnect() ), а по окончании обработки закрывать ( disconnect() ), то это может оказаться приемлемо. Но все равно держать много сессий (даже при том, что это "легкий" объект) имеет смысл только в том случае, если в них хранится состояние или кэшируются часто нужные клиенту данные. Но в этом случае придется за все мэтим смотреть...
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33439945
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все дело в том, что в БД очень много связей и при запросе например того же юзера по его ID, метод ( допустим: User getUserById(long userId); ) возвращает объект User cо списком ролей, принадлежащих этому пользователю и списком привелегий, принадлежащих этим ролям и т д. Так происходит, потому что в хибернайт-маппинге прописано lazy="false". Использовать lazy="true" я не могу, посколько при вызове этого метода getUserById я открыл хибернайт-сессию получил объект User и закрыл сессию.
Поэтому и возникает потребность иметь хибернейт-сессию открытой для всего сеанса работы.

Те ситуация примерно такая:
Допустим мне надо отобразить список всех юзеров в БД, а затем, ВОЗМОЖНО я захочу посмотреть его роли, а ВОЗМОЖНО и не за хочу. Но поскольку вызов любого метода связан с открытием и закрытием сессии, я не могу использовать фичу lazy="true", которая даст возможность не подкачивать все связи юзера с ролями, ролей с привелегиями и т д.

Может кто то сталкивался с похожим.
Интересуют способы решения
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33440131
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каша какая-то. "...поскольку вызов любого метода связан с открытием и закрытием сессии..." - почему? Вы можете открыть сессию и вызывать сколько угодно методов - как Hibernate, так и своих собственных.

И с чего бы это нельзя использовать lazy="true"? Как раз НАДО использовать, если хотите иметь гибкость и не заставлять код делать ненужные операции.
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33440337
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда клиент хочет получить конкретного юзера, он вызов метод getUserById(lond id):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
     public  User getUserById( long  id) {
          Session session = HibernateUtil.getSession();
          HibernateUtil.beginTransaction();
          User user;
           try  {
              user = (User) session.load(User, id);
              HibernateUtil.commitTransaction();
          }  catch  (HibernateException ex) {
              HibernateUtil.rollbackTransaction();
              ...
          }  finally  {
              HibernateUtil.closeSession();
          }
         return  user;
    }


Те допустим клиент вызвал этот метод и пусть lazy="true" - получил юзера. Дальше я хочу получить роли этого юзера: user.getRoles().
Но я не смогу этого сделать, потому что хибернайт-сессия уже закрыта! и этот юзер уже не связан с сесиией вызов user.getRoles() при закрытой сессии кинет эксепшен.

Поэтому в настоящий момент я использую lazy="false" и тяну все связи эзера с другими объектами - что очень накладно
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33440418
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.ГоловановКаша какая-то. "...поскольку вызов любого метода связан с открытием и закрытием сессии..." - почему? Вы можете открыть сессию и вызывать сколько угодно методов - как Hibernate, так и своих собственных.

И с чего бы это нельзя использовать lazy="true"? Как раз НАДО использовать, если хотите иметь гибкость и не заставлять код делать ненужные операции.


А как удаленному клиенту открыть хибернэйт-сессию и далее в ее контектсе вызывать различные методы ?

Допустим у вэб-сервиса есть дополнительно методы openSession() и closeSession(), открывающие и закрывающие хибернайт сесиию.
Если удаленный клиент вызвает:
1. openSession() - создал сесиию
2. getUserById(long id)

Как в вызове второго метод getUserById() получить эту сессию, если все мотоды независимы друг от друга ? Гдк и как хранить эту сессию ?

А если к сервису обратилось несколько клиентов и они вызвали:
1. openSession() - создал сесиию
2. getUserById(long id)

Как понять где какая сессия и с каким клиентом она связана ?
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33440510
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreySerjТе допустим клиент вызвал этот метод и пусть lazy="true" - получил юзера. Дальше я хочу получить роли этого юзера: user.getRoles().
Но я не смогу этого сделать, потому что хибернайт-сессия уже закрыта! и этот юзер уже не связан с сесиией вызов user.getRoles() при закрытой сессии кинет эксепшен.

Ну вы даете. Ну загрузите роли ДО того, как закроется сессия (то есть в том блоке, в котором у Вас user = (User) session.load(User, id); . И все дела.

Во-вторых, зачем для чтения открывать и контролировать транзакцию?
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33440532
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreySerj
А если к сервису обратилось несколько клиентов и они вызвали:
1. openSession() - создал сесиию
2. getUserById(long id)

Как понять где какая сессия и с каким клиентом она связана ?

В каком смысле? Сессия связана с тем клиентом, который и вызвал openSession(). Или еще какие-то связи нужны?
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33440711
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов AndreySerjТе допустим клиент вызвал этот метод и пусть lazy="true" - получил юзера. Дальше я хочу получить роли этого юзера: user.getRoles().
Но я не смогу этого сделать, потому что хибернайт-сессия уже закрыта! и этот юзер уже не связан с сесиией вызов user.getRoles() при закрытой сессии кинет эксепшен.

Ну вы даете. Ну загрузите роли ДО того, как закроется сессия (то есть в том блоке, в котором у Вас user = (User) session.load(User, id); . И все дела.

Во-вторых, зачем для чтения открывать и контролировать транзакцию?



Сори, наверное я торможу.... ;-)
Метод getUserById(...) - это метод вэб-сервиса. Этот метод удаленно вызывает GUI-клиент. Мне читать роли юзера надо не всегда, в большинстве случаев достаточно просто просмотреть его имя и т д. Но иногда нужно и почитать его роли.
Вот здесь бы lazy="true" и помогло бы мне (если б не закрытие сессии). А так я всегда тяну с юзером и его роли, надо мне их смотреть или нет.
...
Рейтинг: 0 / 0
Hibernate + Axis
    #33440756
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов AndreySerj
А если к сервису обратилось несколько клиентов и они вызвали:
1. openSession() - создал сесиию
2. getUserById(long id)

Как понять где какая сессия и с каким клиентом она связана ?

В каком смысле? Сессия связана с тем клиентом, который и вызвал openSession(). Или еще какие-то связи нужны?

GUI-клиент вызывает методы УДАЛЕНHОГО вэб-сервиса.
Типа:
Код: plaintext
1.
2.
3.
4.
        Call call = createCallOfService("getUserById");
        call.addParameter("id",  new  QName(""), ParameterMode.IN);
        Object[] params = { id };
         return  (String) call.invoke(params);

Соответствующий метод вэб-сервиса getUserById, открывет хибернайт-сессию, вытягивает юзера и закрывает сесиию.

Как клиент связан с этой хибернайт-сесиией ?

Вызов другого метода вэб-сервиса происходит уже в своей(новой) сессии.

И вообще, как клиент позже может закрыть конкретную хибернайт-сессию, которую он создал ранее, вызвав метод сервиса openSession? - ведь клиент ничего не знает об этом, все что он может - вызывать удаленные методы вэб-сервиса
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + Axis
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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