У меня есть две таблицы с many-many ассоциацией.
— Фрагмент DB:
загрузки
Идентификатор
Имя:
сессии
Идентификатор
Дата
sessionsloads
LoadId
SessionId
— Будьте в спящем режиме отображая фрагменты:
/* 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>
Для удаления одной записи из таблицы ассоциации sessionsloads, я выполняю этот код:
Session session = sessionDao.getObject(sessionId);
Load load = loadDao.getObject(loadId);
load.getSessions().remove(session);
loadDao.saveObject(load);
Но после запуска этот код ничего не изменяет.
Что правильный путь состоит в том, чтобы удалить ассоциацию?
Вам необходимо обновить обе стороны ссылки между Load
и Сессия
:
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);
}
Похоже, вам просто нужно включить Transitive persistence (например, cascade=all-delete-orphan для "полного" transitive)
--. Редактировать Спасибо за поддержку, хотя Паскаль был точен в том, что одного каскада недостаточно, чтобы решить исходную проблему, но что обе стороны отношений не управлялись. Научите меня отвечать поспешно :)
--
Кроме того, сущность по имени Session сломала мне мозг :(