2010-07-21 11 views
5

Tenemos las dos entidades siguientes con muchos-a-muchos asociación:Cómo eliminar todas las asociaciones en una Hibernate JoinTable a la vez?

@Entity 
public class Role { 
    ... 
    @ManyToMany 
    @JoinTable(name = "user_has_role", joinColumns = { @JoinColumn(name = "role_fk") }, inverseJoinColumns = { @JoinColumn(name = "user_fk") }) 
    private Set<User>   userCollection; 
    ... 
} 

y

@Entity 
public class User { 
    ... 
    //bi-directional many-to-many association to Role 
    @ManyToMany(mappedBy = "userCollection") 
    private Set<Role>  roleCollection; 
    ... 
} 

Si queremos truncar todos los datos con

em.createQuery("DELETE Role").executeUpdate(); 

tenemos que borrar todas las asociaciones en el "user_has_role" JoinTable como se muestra en this answer:

for (...) 
{ 
    A a = aDao.getObject(aId); 
    B b = bDao.getObject(bId); 

    b.getAs().remove(a); 
    a.getBs().remove(b); 
    bDao.saveObject(b); 
} 

¿Hay alguna manera de eliminar todas las asociaciones en el JoinTable de una vez sin iterar sobre todos los datos? ¿Tal vez hay un HQL-Command especial como DELETE Role.user_has_role?

Respuesta

3

Mientras que la especificación JPA escribe claramente que las operaciones masivas no están conectadas en cascada a entidades relacionadas (sección 4.10 Actualización masiva y operaciones de eliminación), espero que los proveedores traten al menos con tablas de unión. Lamentablemente, Hibernate no y esto está registrado en HHH-1917. Solución: use SQL nativo.

Cuestiones relacionadas