[Hibernate] навигация по объектам

stm2388838

Пусть нам нужна обычная связь один-ко-многим, например, Покупатель и его Заказы.
class Покупатель
{
private Collection заказы = new HashSet;
getЗаказы {...}
setЗаказы(...) {...}
...
}
Неужели при использовании Hibernate нужно самому следить за заполнением коллекции "заказы"?
Судя по разделу "2.3.6. Working bi-directional links " документации, вероятно это так (тут связь многие ко многим, но это не суть важно)
So, obviously, if we want to make this link working bi-directional, we have to do the same on the other side - adding a Person reference to the collection in an Event. This "setting the link on both sides" is absolutely necessary and you should never forget doing it.
Many developers program defensive and create a link management methods to correctly set both sides, e.g. in Person
protected Set getEvents {
return events;
}

protected void setEvents(Set events) {
this.events = events;
}

public void addToEvent(Event event) {
this.getEvents.add(event);
event.getParticipants.add(this);
}

public void removeFromEvent(Event event) {
this.getEvents.remove(event);
event.getParticipants.remove(this);
}
Notice that the get and set methods for the collection are now protected - this allows classes in the same package and subclasses to still access the methods, but prevents everybody else from messing with the collections directly (well, almost). You should probably do the same with the collection on the other side.
P.S. про protected они тут какую-то чушь написали

Sanjaz

По-моему, не надо следить за заполнением коллекции "заказы".
Заказы сами заполняются, когда ты выбираешь покупателя из БД.
Точнее, если у тебя в мэппингах стоит lazy=false, то заказы выбираются когда ты выбираешь пользователя, если lazy=true, то заказы выбираются когда вызываешь getЗаказ.

stm2388838

По-моему,
так ты пробовал? в примерах там сами заполняют

Sanjaz

У меня все само заполнялось.
Попробуй сам.

Hastya

Неужели при использовании Hibernate нужно самому следить за заполнением коллекции "заказы"?
Что ты понимаешь под словом "заполнение"? Для обновления двунаправленных связей действительно требуется установка ссылок на обоих концах связи. Когда эти изменения будут распространятся в базу - зависит от настроек каскадности и флага inverse.

stm2388838

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

Hastya

не понял
что значит подхватятся
если закрыть сессию, твои объекты уже перестанут быть "хранимыми"

stm2388838

закрыть сессию, открыть новую и снова запросить объект

Hastya

Какие конкретно запросы сделает Hibernate, зависит от fetch-mode и от того, объявлены ли дочерние классы как lazy. Но для пользователя все коллекции инициализируются прозрачным образом. fetch-mode должен интересовать только с точки зрения производительности, не более.

puare

А типа one-to-many теперь bi-directional? Вообще, при вопросах по hibernate принято приводить mappings и код всех pojo из примера. Так что в студию!

Hastya

bi-directional - это не кардинальность связи, а поддержка ссылок с обоих ее концов.
Оставить комментарий
Имя или ник:
Комментарий: