我有实体User
:
@Entity
@Table(name = "users")
public class User {
(...)
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "users_roles",
joinColumns = @JoinColumn(name = "user_id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "role_id", nullable = false)
)
private List<Role> roles;
}
以及实体Role
和简单的id
和name
列。
User
和Role
与联接表users_roles
具有多对多关系。
我已经创建了删除用户的方法:
public void remove(long userId) {
Session session = getSession();
//NativeQuery joinTableQuery = session.createNativeQuery("DELETE FROM users_roles ur WHERE ur.user_id = :userId");
//joinTableQuery.setParameter("userId", userId);
//joinTableQuery.executeUpdate();
Query userQuery = session.createQuery("DELETE FROM User u WHERE u.id = :userId");
userQuery.setParameter("userId", userId);
userQuery.executeUpdate();
}
我已特意注释掉了第一个NativeQuery,以检查发生了什么。现在有趣的是,Hibernate生成了两个查询:
问题:
为什么当我的users_roles
实体没有在User
关系上设置CascadeType.REMOVE
时,Hibernate在@ManyToMany
(联接表)上生成附加查询?我以为我必须自己写(注释部分)。
答案 0 :(得分:0)
您的User
实体拥有Role
实体的many-to-many association。当您删除User
时,Hibernate也会自动从关联表中删除所有条目。但它不会将删除操作级联到Role
实体。
永远不要在多对多关联上使用CascadeType.REMOVE
。如果删除一个实体,则Hibernate也会删除所有关联的实体,即使它们仍被其他实体引用。我对on my blog进行了详细说明。
如果您要在CascadeType.REMOVE
关联上使用roles
并删除User
,则Hibernate会删除该Role
引用的所有User
实体。即使存在与这些User
相关联的其他Role
实体对象,也会这样做。