我有 3 个表 Role、User 和 UserRole。表 UserRole 包含用户和角色之间的映射以及两个相应的索引列。我正在使用带注释的 hibernate ,并且希望能够“撤销”用户的角色,但这变得有些困难。
在我的用户类中,我有
@ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, targetEntity = Role.class)
@IndexColumn(name = "role_index", base = 0)
@NotFound(action=NotFoundAction.IGNORE)
@JoinTable(name = "tblUser_Role", joinColumns={
@JoinColumn(name = "UID")}, inverseJoinColumns={
@JoinColumn(name = "roleid", nullable = false)})
private List<Role> roles = new ArrayList<Role>(0);
在我的角色类中,我有
@ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy="roles")
private List<User> users = new ArrayList<User>(0);
我调用“撤销”角色的 DAO 方法是
@Override
public boolean revokeRolesFromUserAccount(User user, List<Role> userRoles) {
if (log.isInfoEnabled()) {
log.info("Roles revoked from the User " + user.getUsername());
}
if (user == null) {
return false;
}
if (userRoles == null) {
return false;
}
Iterator<Role> iter = userRoles.iterator();
List<Role> newroles = new ArrayList<Role>(0);
Role role = null;
while (iter.hasNext()) {
role = (Role) this.sessionFactory.getCurrentSession().load(
Role.class, iter.next().getRoleid());
newroles.add(role);
}
User newUser = null;
newUser = (User) this.sessionFactory.getCurrentSession().load(User.class, user.getUid());
newUser.getRoles().removeAll(newroles);
this.sessionFactory.getCurrentSession().saveOrUpdate(newUser);
return true;
}
由于某种原因,这不能按预期工作,当突破时,我注意到角色没有被初始化,我猜是由于 LazyLoading,我尝试做类似 Hibernate.initialize(newUser.getRoles()) 的事情
但这并没有改变任何东西。我仍在学习 hibernate 的诀窍,不确定我错过了什么,也许是一些非常明显的东西?非常感谢您提前投入的时间和想法!
更新:在尝试了 Paujo 和 Matin Kh 建议的修复并进行进一步调试后,我仍然没有看到在 newUser = (User) this.sessionFactory.getCurrentSession() 行之后加载的角色有任何差异。 load(User.class, user.getUid());
这是我的 tblUser_Role 的副本,不确定这是否有帮助。再次感谢!
(添加角色效果很好)
最佳答案
我这里的情况就是这样。您的问题有一个非常简单的解决方案。
对于其中一个类,请使用 EAGER
,而对于另一个类,请使用 LAZY
。试试这个:
角色:
@ManyToMany(fetch=FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy="roles")
private List<User> users = new ArrayList<User>(0);
用户:
@ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, targetEntity = Role.class)
@IndexColumn(name = "role_index", base = 0)
@NotFound(action=NotFoundAction.IGNORE)
@JoinTable(name = "tblUser_Role", joinColumns={
@JoinColumn(name = "UID")}, inverseJoinColumns={
@JoinColumn(name = "roleid", nullable = false)})
private List<Role> roles = new ArrayList<Role>(0);
关于java - Hibernate删除关系manyToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222291/