현재 사용자를 세션에 저장하고 현재 사용자 (예 : user.getRole.getRoleName())를 사용하면 LIE가됩니다.Struts Spring Hibernate에서의 Lazy 초기화 최대 절전 모드
public String home(){
Users users = userService.getCurrentUser();
if(users.getRole().getRoleName().equals("admin")){ //causing LIE
....
}
UserService : 내가 userService.getCurrentUser를 변경할 때() 이렇게 될
@Override
public Users getCurrentUser(){
session = ActionContext.getContext().getSession();
return (Users) session.get("user");
}
하지만, 오류가 난이 문제를 해결할 수있는 방법, 내 코드는이
컨트롤러처럼 나는 현재 사용자를 사용할 때마다 데이터베이스에 연결해야하기 때문에 이것이 올바른 방법이 아니라고 생각합니다.
@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를 사용하지 않는 것으로 동의합니다. 필요에 따라 모든 데이터가로드되기 때문에 FetchType.EAGER를 사용하지 마십시오. user.getRole()에 관한 ; 우리가 더 자세한 데이터가 필요한 경우, 예를 들어 다른 모델의 경우, 모든 모델에 대해 수행 할 것인지 여부와 같은 경우? 나는 affraid입니다, 궁극적으로 이것은 FetchType.EAGER에 가깝습니다. 내가 맞습니까? –
모든 경우에 필요하게 될 노드 만 가져 오도록 코드를 구성해야합니다 ... – barsju
코드 user.getRole();이 (가) 열려있는 세션이 없으므로 작동하지 않습니다 (LIE를 얻습니다). 실행. 다른 방법이 있습니까? –