2010-05-06 25 views
9

Tengo dos tablas con la asociación muchas-a-muchas.Hibernar: eliminar asociación muchos-a-muchos

- fragmento DB:

cargas
Id
Nombre

sesiones
Id
Fecha

sessionsloads
LOADID
SessionId

- Hibernate fragmentos de asignación:

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

el fin de eliminar una entrada de la tabla de asociación sessionsloads, ejecuto este código:

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

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

Pero, después del lanzamiento, este código no cambia nada.

¿Cuál es la forma correcta de eliminar una asociación?

Respuesta

15

Es necesario actualizar ambos lados de la relación entre Load y Session:

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

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

En realidad, muchos desarrolladores usan métodos de defensa para administrar asociaciones bidireccionales. Por ejemplo, en Load, puede agregar los siguientes métodos:

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

Gracias, lo intenté, pero tampoco funciona. Hibernate incluso no escribe ninguna consulta 'delete' en el registro. – 0x2D9A3

+2

@Bar Debe haber otro problema en alguna parte porque definitivamente funciona. Trataré de reproducirlo más tarde con su mapeo, pero sé que está funcionando. –

+0

Como mencionaste, 'cascade' no funciona en este caso, ¿verdad? Además, la gente dice que puede funcionar con 'session.flush()'. Pero, ¿qué puedo hacer si uso 'getHibenateTemplate'? – 0x2D9A3

5

Parece que sólo tiene que activar la persistencia transitiva (por ejemplo, en cascada = all-delete-orphan para transitivo "completo".)

- Editar Gracias por la upvote, Pascal fue althugh preciso en esa cascada por sí solo no es suficiente para solucionar el problema original, pero que ambos lados de la relación no estaban siendo administrados. enséñame a responder a toda prisa :)

-

Además, una entidad llamada Sesión rompió mi cerebro :(

+1

De todos modos, gracias. En realidad, votó a favor de la 'Sesión'. De acuerdo, ya que es un nombre totalmente inadecuado. Pero no puede cambiarlo en este momento. – 0x2D9A3