日期:2014-05-18  浏览次数:20657 次

java用hibernate实现对象属性(或集合属性)的延迟加载问题
@Autowired
private IUserService userService;

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection ps) {

Set<String> permissions = new HashSet<String>();
Set<String> roles = new HashSet<String>();//保持为空,直接使用权限
Collection<User> principalsList = ps.byType(User.class);
if (principalsList.isEmpty()) {
throw new AuthorizationException("Empty principals list!");
}
for(User u : principalsList) {
User oneUser = userService.findById(u.getUsid());
permissions.addAll(getAllPermissions(oneUser));
}
SimpleAuthorizationInfo anthInfo = new SimpleAuthorizationInfo(roles);
anthInfo.setStringPermissions(permissions);
return anthInfo;
}
/**
 * 传入一个User对象,查出它的全部权限,以{@code Set<String>}形式返回
 */
public Set<String> getAllPermissions(User user) {

Set<String> permissions = new HashSet<String>();
Role role = user.getRole();
if(role == null) {
return new HashSet<String>();
}
Set<Permission> pers = role.getPers();
for(Permission p : pers) {
permissions.add(p.getPerName());
}
return permissions;
}


如上,我将User对象传给getAllPermissions方法,想在其中得到其对象属性role,以及进一步得到role的集合属性,但现在的问题是,从role开始我就得不到了,集合就得到的更是null了。报的错误是No Session,怎么能让它得到啊,是要加什么过滤器吗?
------解决方案--------------------
no session有一种情况就是这样 你用了延迟加载 对象里面只是一个代理对象 然后在页面上要拿出来用的时候 那个时候session已经没了 所以就报no session 这时候用opensessionview就有用 如果是你把数据库从user查出来 再在后台传给别人用 那么你要么别设置延迟加载 要么就在拿出user的那个事物内把role再拿一次就ok了 你把user从数据库拿出来的方法总是有session的
------解决方案--------------------
你使用了懒加载,使用懒加载session被关闭之后集合中就不能得到数据了,(因为集合中本来就没有数据,只是在你需要的时候进行查询);现在你可以将lazy设置为false,或者延迟关闭session
------解决方案--------------------
如果你的类是通过向导生成的话,User与Role之间的关系是双向的多对一
就去找User.hbm.xml找关于Role的属性配置,lazy=false;重启服务就能获取Role的实例了。
Role与Perimssions的关系是一对多
在Role.hbm.xml中找到关于Permissions的配置,修改lazy=false即可。
如果考虑性能,就用Hibernate.initialize(User.props);里面传入实例对象的属性即可