Hibernate может использовать список ??есть дубликаты - PullRequest
1 голос
/ 26 августа 2011

Может ли Hibernate действительно использовать список?Я сомневаюсь.Вот пример.

Родитель и потомок GrandParent, все двунаправленные отношения «один ко многим» (многие - это сторона управления)

У GrandParent есть список родителя, а у родителя - список потомка.,если вы напишите sql следующим образом

select distinct g from grandParent g inner join fetch g.parent p inner join fetch p.child c where c.age < 5

, то выберете другого деда.но когда вы пытаетесь получить родителя с помощью g.getParents ();вы найдете там дубликаты.эта проблема очень хорошо объяснена здесь и дает решения.http://blog.eyallupu.com/2010/06/hibernate-exception-simultaneously.html

, по мнению автора, существует 3 решения:

  1. использование @IndexColumn Изменил семантику из пакета в список (добавив аннотацию @IndexColumn)Сделайте сторону отношения один-ко-многим стороной-владельцем (чтобы Hibernate автоматически управлял индексом).

    недостаток: поскольку один-ко-многим без обратного, он будет генерировать больше sql и вредитьПроизводительность.

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

  2. использовать LAZY fetching.если вы хотите, чтобы у grandParent был соответствующий родитель, а у родительского - соответствующий дочерний, вы не можете пропустить выборку, поэтому вы не можете выполнять отложенную загрузку.эта ссылка имеет пример hibernate, как правильно загрузить граф объектов

  3. использовать набор (я думаю, что это единственное хорошее решение, но порядок теряется, придетсяиспользуйте treeset или connectedHashSet).

, поэтому мой вопрос.Действительно ли список можно использовать в спящем режиме?если я действительно хочу использовать список, есть ли лучший способ?

, если это заставляет меня загружать каждый уровень (сначала дедушка, потом родитель, потом потомок) отдельно, зачем мне hibernate, springjdbc может сделать это, используя sqlболее эффективно.действительно ли я могу получить выгоду от использования hibernate по сравнению с springjdbc?

1 Ответ

1 голос
/ 26 августа 2011

При использовании List<Object> в спящем режиме вы должны использовать @IndexedColumn, это своего рода аксиома, и она упоминается в Справочном руководстве по Hibernate, черным по белому, в главе сопоставления коллекций, поэтому я не понимаю, почему автор этого блога предложил этокак обходной путь.

Что касается отложенной загрузки, у нее есть много плюсов и минусов, если вы используете HQL, это не даст вам никаких преимуществ, но если вы захотите получить Parent, используя

Parent parent = session.load(Parent.class,id);

и выполнить любую операцию над списком, а затем использовать

session.update(parent);

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

проблемная сторона Laziness заключается в том, что при попытке инициировать прокси-сервер при закрытии сеанса Hibernate (это часто случается в веб-приложениях) вы получите исключение.

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