我在弄security但是延时加载的时候出现问题了!no session or session is close 没有session或者session关闭我先把代码帖出来大家看看!网上有人说要加个clone()这个方法能够解决问题!但是他又没帖怎么用!求高手解答!请不要告诉我OpenSessionInViewFilter坦白的告诉你们这个没有用!也许是security资源查询的顺序为最前,而这个拦截器还没造好吧!
上代码
实体类对象我是用注解实现的!package com.onionbbs.model;import java.util.HashSet;
import java.util.Set;import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;@Entity
@Table(name="Resources")
public class Resources {
@Id
@GeneratedValue
@SequenceGenerator(name="ResourcesSequence")
@Column(name="id")
private int id;
@Column(name="name",length=30)
private String name;
@Column(name="url",length=255)
private String url;
@Column(name="Enabled")
private int Enabled;
@Column(name="isSystem")
private int isSystem;

@JoinTable(name="role_resource",inverseJoinColumns=@JoinColumn(name="resources_id"),joinColumns=@JoinColumn(name="role_id"))
@ManyToMany(cascade=CascadeType.REFRESH,fetch = FetchType.EAGER)
private Set<Role> role=new HashSet<Role>();

public Set<Role> getRole() {
return role;
}
public void setRole(Set<Role> role) {
this.role = role;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getEnabled() {
return Enabled;
}
public void setEnabled(int enabled) {
Enabled = enabled;
}
public int getIsSystem() {
return isSystem;
}
public void setIsSystem(int isSystem) {
this.isSystem = isSystem;
}

    public Object clone() throws CloneNotSupportedException {   
     return super.clone();   

}数据访问层package com.OnionEntertainment.Security.Dao;import java.util.List;import org.springframework.orm.hibernate3.HibernateTemplate;import com.onionbbs.model.Resources;public class SecurityResourceDaoImp  implements SecurityResourceDao{
private HibernateTemplate hibernateTemplate;

public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
} @SuppressWarnings("unchecked")
public List<Resources> getAllResources() {

return this.hibernateTemplate.find(" from "+Resources.class.getName());

}}业务层代码,会不会是我用的是注解的事务引起的呢?package com.OnionEntertainment.Security.Service;import java.util.List;import org.springframework.transaction.annotation.Transactional;import com.OnionEntertainment.Security.Dao.SecurityResourceDaoImp;
import com.onionbbs.model.Resources;
@Transactional
public class SecurityResourceServiceImp implements SecurityResourceService{
private SecurityResourceDaoImp securityResourcesDao;
public void setSecurityResourcesDao(SecurityResourceDaoImp securityResourcesDao) {
this.securityResourcesDao = securityResourcesDao;
} public List<Resources> getAllResources() {

return securityResourcesDao.getAllResources();
}
}最后是在这里延时加载数据的这个是security的加载资源的一个类,在服务一启动的时候就开始加载数据库中的资源对象。package com.onionbbs.security;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.security.web.util.AntUrlPathMatcher;
import org.springframework.security.web.util.UrlMatcher;import com.OnionEntertainment.Security.Service.SecurityResourceServiceImp;
import com.onionbbs.model.Resources;
import com.onionbbs.model.Role;
public class InvocationSecurityMetadataSource
        implements FilterInvocationSecurityMetadataSource {    private UrlMatcher urlMatcher = new AntUrlPathMatcher();;
    private static Map<String, Collection<ConfigAttribute>> resourceMap = null;
    private SecurityResourceServiceImp securityResourceService;
    
    public void setSecurityResourceService(
SecurityResourceServiceImp securityResourceService) {
this.securityResourceService = securityResourceService;
}
 
    
    
public void loadResourceDefine() {

        resourceMap = new HashMap<String, Collection<ConfigAttribute>>();
        
        for(Resources item:securityResourceService.getAllResources()){
        
           resourceMap.put(item.getUrl(), listRoleToCollection(item.getRole()));        //也就是在这个地方进行加载资源所对应的权限的item.getRole()的
        }
    }
求高手解答这个问题,到底是用clone()方法呢?还是使用别的方法能够解决。是用clone()方法该怎么使用?添加在哪里?