2010-05-06 1 views
9

Ho due tabelle con l'associazione many-to-many.Hibernate: elimina l'associazione many-to-many

- DB frammento:

carichi
Id
Nome

sessioni
Id
Data

sessionsloads
LoadId
SessionId

- Sospensione frammenti di mappatura:

/* 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> 

Al fine di rimuovere una voce dalla tabella di associazione sessionsloads, eseguo questo codice:

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

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

Ma, dopo il lancio, questo codice non cambia nulla.

Qual è il modo giusto per rimuovere un'associazione?

risposta

15

È necessario aggiornare entrambi i lati del legame tra Load e Session:

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

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

In realtà, molti sviluppatori utilizzano metodi difensivi per gestire associazioni bidirezionali, ad esempio su Load, è possibile aggiungere i seguenti metodi:

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

Grazie, ci ho provato, ma non funziona. Hibernate perfino non scrive alcuna query 'delete' nel log. – 0x2D9A3

+2

@Bar Ci deve essere un altro problema da qualche parte, perché funziona sicuramente. Proverò a riprodurre in seguito con la mappatura, ma so che sta funzionando. –

+0

Come hai detto, 'cascade' non funziona in questo caso, giusto? Inoltre, la gente dice che può funzionare con 'session.flush()'. Ma cosa posso fare se uso 'getHibenateTemplate'? – 0x2D9A3

5

Sembra che basta accendere la persistenza transitiva (ad esempio, cascade = all-delete-orphan per "pieno" transitiva.)

- Modifica Grazie per l'upvote, althugh Pascal era Preciso in quella cascata da solo non è sufficiente per risolvere il problema originale, ma che entrambi i lati della relazione non sono stati gestiti. Insegnami a rispondere in fretta :)

-

Inoltre, un'entità di nome sessione ha rotto il mio cervello :(

+1

In ogni caso, grazie. In realtà, upvoted per la 'Session'. D'accordo perché è un nome totalmente inadatto. Ma non può cambiarlo al momento. – 0x2D9A3