Почему Hibernate, кажется, предназначен для коротких сессий? - PullRequest
2 голосов
/ 24 сентября 2008

Я знаю, что это субъективный вопрос, но почему Hibernate, кажется, предназначен для коротких сеансов? Обычно в моих приложениях я создаю DAO для абстрагирования своего уровня данных, но поскольку я не могу предсказать, как будут использоваться объекты сущностей, некоторые из его коллекций загружаются с отложенной загрузкой, или я должен сказать, что не удается загрузить после закрытия сессии.

Почему они не разработали его так, чтобы он автоматически открывал сессию, или сеансы всегда оставались открытыми?

Ответы [ 6 ]

4 голосов
/ 24 сентября 2008

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

Я полагаю, вы хотите лениво загрузить объект с вашего взгляда - посмотрите здесь для некоторых опций Я предпочитаю точно определять, какая часть карты объекта будет возвращена моими методами фасада сеанса. Я считаю, что это облегчает юнит-тестирование и тестирование производительности моего бизнес-уровня.

2 голосов
/ 24 сентября 2008

Я работал над настольным приложением, которое использовало EJB и Hibernate. Мы должны были установить lazy=false везде, потому что, когда объекты сериализуются, они теряют способность извлекаться из серверной части. К сожалению, так оно и есть.

Если вы обеспокоены производительностью, вы можете использовать кэширование на бэкэнде, чтобы ваши ленивые извлечения не были такими болезненными.

1 голос
/ 24 сентября 2008

Я пишу настольное приложение, поэтому использование фильтра неприменимо.

1 голос
/ 24 сентября 2008

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

0 голосов
/ 24 сентября 2008

Hibernate предназначен для отображения объектов в таблицах реляционной базы данных. Это очень хорошо справляется с этой работой. Но это не может угодить всем постоянно. Я думаю, что есть некоторая сложность в изучении, как работает инициализация, но как только вы освоите ее, это имеет смысл. Я не знаю, было ли это обязательно «предназначено», чтобы разозлить вас, просто так это и произошло.

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

0 голосов
/ 24 сентября 2008

Соединения - это дефицитный ресурс, который необходимо утилизировать, как только вы их используете. Если вы также используете пул соединений, получение другого, когда вам это нужно, должно быть быстрым. Это архитектура, которую вы должны использовать для масштабирования веб-сайтов - даже если вы используете настольное приложение, их сценарии использования, вероятно, сосредоточены на масштабируемых сайтах.

Если вы посмотрите на MS ADO.NET, вы увидите похожую направленность на кратковременное поддержание открытых соединений - у них есть целая автономная модель для обновления отключенных данных, а затем применения к базе данных, когда вы будете готовы. 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...