hibernate中使用clone()方法!求解!

chaohua20 2011-01-11 03:20:51
我在弄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()方法该怎么使用?添加在哪里?

...全文
72 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaohua20 2011-01-11
  • 打赏
  • 举报
回复
谢谢了,第二个打不开但是也出了力了,呵呵
yiyexiao2003 2011-01-11
  • 打赏
  • 举报
回复
http://kennylee26.javaeye.com/blog/358032

67,511

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧