Как проверить, подключен ли объект к другому в спящем режиме - PullRequest
3 голосов
/ 06 января 2011

Представьте себе два класса объектов домена, A и B. A имеет двунаправленное отношение «один ко многим» с B. A относится к тысячам B. Отношения должны быть уникальными, дубликат не может быть.

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

А как насчет текущих переходных отношений?

class A {
   @OneToMany
   private List<B> listOfB;
}

Если мы получим доступ к listOfB и выполним проверку contains(), это приведет к извлечению всех подключенных экземпляров B lazy из источника данных. Я хочу проверить их только по первичному ключу.

Есть ли простое решение, где я мог бы делать такие вещи, как " Связан ли этот экземпляр A с этим экземпляром B? ", не загружая все эти данные в память и не выполняя поиск на основе коллекций?

Ответы [ 4 ]

2 голосов
/ 07 января 2011

Спасибо за все ответы. Дополнительная ленивая коллекция сделала свое дело для меня. Я настроил соединение @OneToMany с аннотацией LazyCollection.

@IndexColumn(name = "index", base = 1)
@LazyCollection(LazyCollectionOption.EXTRA)

Статья Hibernate: очень ленивая загрузка из коллекции помогла мне в этом. При использовании этой опции #size(), #contains(), #get() и т. Д. Не запускают инициализацию коллекции.

1 голос
/ 07 января 2011

я думаю, что это можно сделать в два этапа. Для переходных B, Добавьте ваш переходный процесс B's to listOfB также добавляют к переходному процессу список тоже. И делайте ваши проверки в этом списке.

Для ваших постоянных B используйте запрос, например,

select count(*) from B b where b.a.id = :aId

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

0 голосов
/ 06 января 2011

Почему вы не можете выполнить INNER JOIN?

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

0 голосов
/ 06 января 2011

Подумав еще раз о последнем абзаце вашего вопроса, поскольку связь двунаправленная, я бы выполнил поиск вашего конкретного экземпляра B с ассоциацией с A.

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