我將當前用戶保存在會話中,當我使用當前用戶(例如:user.getRole.getRoleName())時,我得到了LIE。我怎樣才能解決這個問題,我的代碼是這樣的懶惰初始化在Struts中的Hibernate Spring Hibernate
控制器:
public String home(){
Users users = userService.getCurrentUser();
if(users.getRole().getRoleName().equals("admin")){ //causing LIE
....
}
UserService:
@Override
public Users getCurrentUser(){
session = ActionContext.getContext().getSession();
return (Users) session.get("user");
}
但是,當我改變userService.getCurrentUser()是這樣的,錯誤已解決,但我認爲這不是一種正確的方式,因爲每次使用當前用戶時都需要連接到數據庫。
@Override
public Users getCurrentUser(){
session = ActionContext.getContext().getSession();
return daoManager.getDetailUser(((Users) session.get("user")).getUsername());
}
DaoManager.getDetailUser是這樣
@Override
public Users getDetailUser(String username) {
try {
Users user = (Users)sessionFactory.getCurrentSession().createQuery("SELECT U FROM Users U WHERE U.username=:USERNAME")
.setParameter("USERNAME", username)
.uniqueResult();
return user;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
有沒有其他更好的辦法來解決這個問題?謝謝。
同意您不使用FetchType.EAGER,因爲所有數據都將被加載,無論它是否需要。 關於user.getRole();如果我們需要更深層的數據,例如在其他情況下,我們是否會爲每個模型都做到這一點?我很害怕,最終這將會接近FetchType.EAGER。我對嗎? – 2012-04-10 16:36:31
那麼你應該組織你的代碼,以便你只需要獲取在任何情況下你將需要的節點... – barsju 2012-04-10 19:35:41
它不工作(獲得LIE),因爲在沒有打開會話時代碼user.getRole();執行。有沒有其他方法? – 2012-04-12 09:22:33