2010-05-06 2 views
9

У меня есть две таблицы с ассоциацией «многие-ко-многим».Hibernate: удалить связь many-to-many

- DB фрагмент:

грузы
Id
Имя

сессий
Id
Дата

sessionsloads
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> 

Для того, чтобы удалить одну запись из таблицы ассоциации sessionsloads я выполнить этот код:

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

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

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

Какой способ удалить ассоциацию?

ответ

15

Вам необходимо обновить обе стороны линии связи между 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); 
} 
+0

Спасибо, пробовал, но не работает. Hibernate даже не записывает никакого запроса 'delete' в журнал. – 0x2D9A3

+2

@Bar Должна быть другая проблема, потому что это определенно работает. Я попытаюсь воспроизвести позже с вашим картографированием, но я знаю, что он работает. –

+0

Как вы упомянули, 'cascade' не работает в этом случае, правильно? Кроме того, люди говорят, что он может работать с 'session.flush()'. Но что я могу сделать, если я использую 'getHibenateTemplate'? – 0x2D9A3

5

Похоже, вам просто нужно включить транзитивном настойчивость (например, каскад = все-удалить-сирота для «полного» транзитивной.)

- Редактировать Благодарность за upvote, althugh Паскаль был точного в том, что только один каскад недостаточно, чтобы исправить исходную проблему, но что обе стороны отношений не управляются. Научи меня, чтобы ответить наспех :)

-

Кроме того, объект с именем Session сломал мой мозг :(

+1

В любом случае, спасибо. На самом деле, для «сессии». Согласился, поскольку это совершенно неподходящее имя. Но в настоящее время он не может его изменить. – 0x2D9A3

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