5

多対多の関連付けを持つ次の 2 つのエンティティがあります。

@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();

この回答に示すように、「user_has_role」JoinTable のすべての関連付けをクリアする必要があります。

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

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

すべてのデータを反復せずに、JoinTable 内のすべての関連付けを一度に削除する方法はありますか? たぶん、特別な HQL-Command のようなものがありDELETE Role.user_has_roleますか?

4

1 に答える 1

3

JPA 仕様では、一括操作は関連するエンティティにカスケードされないことが明確に記述されていますが(セクション 4.10 一括更新および削除操作)、プロバイダーは少なくとも結合テーブルを処理することを期待しています。悲しいことに、Hibernate はそうではなく、これはHHH-1917に記録されています。回避策: ネイティブ SQL を使用します。

于 2010-07-21T15:41:57.720 に答える