Как удалить все ассоциации в Hibernate JoinTable одновременно? - PullRequest
5 голосов
/ 21 июля 2010

У нас есть следующие две сущности со многими ко многим:

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

и

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

Если мы хотим обрезать все данные с помощью

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

мы должны очистить все ассоциации в JoinTable "user_has_role", как показано в этом ответе :

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

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

Есть ли способ удалить все ассоциации в JoinTable сразу, не повторяя все данные? Может быть, есть специальная HQL-команда типа DELETE Role.user_has_role?

1 Ответ

3 голосов
/ 21 июля 2010

Хотя в спецификации JPA четко указано, что массовые операции не каскадируются для связанных сущностей (раздел 4.10 Операции массового обновления и удаления), я ожидаю, что провайдеры будут иметь дело по крайней мере с таблицами соединения. К сожалению, Hibernate не делает, и это вошло в систему HHH-1917 . Обходной путь: используйте собственный SQL.

...