2011-01-06 6 views
3

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

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

Что относительно текущих переходных отношений?

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

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

Есть простое решение, где я могу сделать что-то вроде «ли подключен этот экземпляр A с этим экземпляром B?» без загрузки всех этих данных в память и выполняет поиск на основе коллекций?

ответ

2

Спасибо вы за все ответы. Эта ленивая коллекция сделала для меня трюк. Я сконфигурировал соединение @OneToMany с аннотацией LazyCollection.

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

Статья Hibernate: Extra-lazy collection fetching помогла мне это сделать. Когда вы используете эту опцию, #size(), #contains(), #get() и т. Д. Не инициируют инициализацию коллекции.

0

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

+0

Он определенно загружает все объекты, вот в чем проблема, у нас есть проблема с производительностью. Hibernate создает и инициализирует все эти объекты. – codevour

0

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

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

1

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

Для вашего сохранялись Б, использовать что-то вроде запроса,

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

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

Смежные вопросы