Гибернация: удаление ассоциации «многие ко многим» - PullRequest
9 голосов
/ 06 мая 2010

У меня есть две таблицы с ассоциацией «многие ко многим».

- Фрагмент БД:

загружает
Id
Имя

сессий
Id
Дата

сессий
LoadId
SessionId

- Фрагменты отображения Hibernate:

/* loads.hbm.xml */
<set name="sessions" table="sessionsloads" inverse="true">
    <key column="LoadId" />
    <many-to-many column="SessionId" class="Session" />
</set>
…
/* sessions.hbm.xml */
<set name="loads" table="sessionsloads">
    <key column="SessionId" />
    <many-to-many column="LoadId" class="Load" />
</set>

Чтобы удалить одну запись из таблицы ассоциации сессий , я выполняю этот код:

Session session = sessionDao.getObject(sessionId);
Load load = loadDao.getObject(loadId);

load.getSessions().remove(session);
loadDao.saveObject(load);

Но послепри запуске этот код ничего не меняет.

Как правильно удалить связь?

Ответы [ 2 ]

15 голосов
/ 06 мая 2010

Вам необходимо обновить обе стороны ссылки между Load и Session:

Session session = sessionDao.getObject(sessionId);
Load load = loadDao.getObject(loadId);

load.getSessions().remove(session);
session.getLoads().remove(load);
loadDao.saveObject(load);

На самом деле, многие разработчики используют защитные методы для управления двунаправленными ассоциациями. Например, на Load вы можете добавить следующие методы:

public void removeFromSessions(Session session) {
    this.getSessions().remove(session);
    session.getLoads().remove(this);
}
public void addToSessions(Session session) {
    this.getSessions().add(session);
    session.getLoads().add(this);
}
5 голосов
/ 06 мая 2010

Похоже, вам просто нужно включить транзитивное постоянство (например, cascade = all-delete-orphan для "полного" транзитива.) - редактировать Спасибо за поддержку, хотя Althugh Pascal был точен в том, что одного каскада недостаточно, чтобы решить первоначальную проблему, но обе стороны отношений не были управляемыми. Научи меня отвечать на скорую руку:)

-

Кроме того, сущность по имени Сессия сломала мне мозг: (

...