java - 在未设置 CascadeType.REMOVE 时,Hibernate 在多对多关系中生成附加查询
问题描述
我有实体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
并与 join tableRole
有多对多的关系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 生成了两个查询:
- Hibernate:从 users_roles where (user_id) in (select id from users where id=?) 中删除
- 休眠:从 id=? 的用户中删除
问题:
为什么当我的实体没有设置关系时,Hibernate 会在users_roles
(连接表)上生成额外的查询?我想我必须自己写(评论部分)。User
CascadeType.REMOVE
@ManyToMany