我有3個表角色,用戶和UserRole。 UserRole表包含用戶和角色之間的映射以及兩個相應的索引列。我在註釋中使用hibernate,希望能夠從用戶那裏「撤銷」一個角色,但是這會變得有點困難。休眠刪除關係manyToMany
在我的用戶類我有
@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方法我打電話到 「撤銷」 的角色(s)爲
@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的繩索,我不知道我錯過了什麼,也許是非常明顯的?提前感謝您的時間和想法!
UPDATE:試圖通過Paujo和晨報的Kh建議的修復和做進一步的調試我還沒有看到在角色的任何差異被加載後線newUser = (User) this.sessionFactory.getCurrentSession().load(User.class, user.getUid());
這裏後我tblUser_Role的副本,不知道如果這有幫助。再次感謝!
(添加角色只是罰款)
將'@ Transactional'添加到'revokeRolesFromUserAccount'應該處理LazyLoading的問題。你在調用'revokeRolesFromUserAccount'時會得到異常嗎?當你調試這行'newUser.getRoles()。removeAll(newroles);'時,用戶中是否有任何角色? – Pao
謝謝你的迴應!這似乎並沒有解決EAGER加載問題。調試時,似乎角色仍然沒有加載到newUser中,只是在'newUser =(User)this.sessionFactory.getCurrentSession()。load(User.class,user.getUid());'行後面。 (我也做了Matin Kh建議的修改,並在'Role'中的'List'上添加了'fetch = FetchType.EAGER'任何其他想法都將不勝感激!再次感謝! –
Curt