用户User与Role,Resource关联都是lazy,而使用Spring Security时,用户登陆成功需要预先取得User的所有权限资源,项目的写法是:
List<User> userList = userDAO.find("select distinct u FROM User u left join fetch u.roles r left join fetch r.resources s where u.name=? and u.enabled = 1", userName);
另我迷惑不解的是,是LAZY就是用户在需要角色资源时,就直接可以取到,因为我们配置了OpenSessionInViewFilter,为什么还要在取用户时还要用left join fetch去取角色和资源,
10.1那天无聊时想起,openSessionViewFilter是指jdbc session与http request的生命周期同步,从一个请求开始到返回页面时openSessionView会保持数据库连接打开,页面处理完成后当前数据库session关闭。
而我所看到的User如果不用left join fetch则登陆成功后,一个请求完成则当前数据库连接关闭,当然你在后面使用LAZY取角色和资源时出现session已经关闭的错误。到这里就知道要用left join fetch一次性将所有角色资源对象取到。
看书更多需要思考和实践!