could not initialize proxy - no Session

实体类FileManager:
package com.dynastarter.sc.file.po;

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**

  • Filemanager entity.
  • @author MyEclipse Persistence Tools
    */
    @Entity
    @Table(name = "filemanager")
    public class FileManager implements java.io.Serializable {
    private Long id;
    private String filename;
    private Integer fileSize;
    private String fileContentType;
    private Long site;
    private Date uploadTime;
    private Integer parentDirectory;
    private Byte isDirectory;
    private Byte isFile;

    // Constructors

    /** default constructor */
    public FileManager() {
    }

    // Property accessors
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long getId() {
    return this.id;
    }

    public void setId(Long id) {
    this.id = id;
    }

    @Column(name = "filename")
    public String getFilename() {
    return this.filename;
    }

    public void setFilename(String filename) {
    this.filename = filename;
    }

    @Column(name = "fileSize")
    public Integer getFileSize() {
    return this.fileSize;
    }

    public void setFileSize(Integer fileSize) {
    this.fileSize = fileSize;
    }

    @Column(name = "fileContentType")
    public String getFileContentType() {
    return this.fileContentType;
    }

    public void setFileContentType(String fileContentType) {
    this.fileContentType = fileContentType;
    }

    @Column(name = "site")
    public Long getSite() {
    return this.site;
    }

    public void setSite(Long site) {
    this.site = site;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "uploadTime")
    public Date getUploadTime() {
    return this.uploadTime;
    }

    public void setUploadTime(Date uploadTime) {
    this.uploadTime = uploadTime;
    }

    @Column(name = "parentDirectory")
    public Integer getParentDirectory() {
    return this.parentDirectory;
    }

    public void setParentDirectory(Integer parentDirectory) {
    this.parentDirectory = parentDirectory;
    }

    @Column(name = "isDirectory")
    public Byte getIsDirectory() {
    return this.isDirectory;
    }

    public void setIsDirectory(Byte isDirectory) {
    this.isDirectory = isDirectory;
    }

    @Column(name = "isFile")
    public Byte getIsFile() {
    return this.isFile;
    }

    public void setIsFile(Byte isFile) {
    this.isFile = isFile;
    }
    }
    -----但是根据id获得对象是就报错
    dao:
    @Repository
    public class FileManagerDAO extends HibernateDao {

    /**

    • 根据目录id找到该目录下的文件
    • @param id目录id值
    • @return */ public List getFileManagerByParentId(int id){ List list=this.getSession().createQuery(" from FileManager where parentDirectory="+id+" ").list(); return list; }

}

service:
@Service
@Transactional
public class FileManagerService {
@Autowired
private FileManagerDAO fileManagerDAO;

public FileManager getRootFileManager(){
    return fileManagerDAO.get(new Long(1));
}


public FileManager getFileManager(Long id){
    return fileManagerDAO.get(id);
}

@Transactional
public void deleteFileManager(Long id){
     fileManagerDAO.delete(id);
}

public List<FileManager> getFileManagerByParentId(int parentId){
    return fileManagerDAO.getFileManagerByParentId(parentId);
}

}

action中调用:

public String loadDocument() throws Exception{
StringBuilder sb=new StringBuilder("[");
String root=getRequest().getParameter("root");
if(root!=null&&"true".equals(root)){
FileManager fileManager= fileManagerService.getRootFileManager();
System.out.println(fileManager.getId());
sb.append("{");
sb.append("'id':").append(""+fileManager.getId()+",");
sb.append("'fileName':").append("'"+fileManager.getFilename()+"',");
sb.append("'fileSize':").append(fileManager.getFileSize()+",");
sb.append("'fileContentType':").append("'"+fileManager.getFileContentType()+"',");
// sb.append("'uploadUser':").append("'"+fileManager.getUploadUser().getPersonName()+"',");
sb.append("'uploadTime':").append("'"+fileManager.getUploadTime()+"',");
sb.append("'isDirectory':").append("'"+fileManager.getIsDirectory()+"',");
sb.append("'isFile':").append("'"+fileManager.getIsFile()+"',");
sb.append("'childFiles':");
sb.append("''");
sb.append("}");
/* sb.append("{");
sb.append("'id':").append("1,");
sb.append("'fileName':").append("'呵呵',");
sb.append("'parentDirectory':").append("-1");
sb.append("}");*/
}
else{

List list=fileManagerService.getFileManagerByParentId(id);
for(FileManager fileManager1:list){
sb.append("{");
sb.append("'id':").append(""+fileManager1.getId()+",");
sb.append("'fileName':").append("'"+fileManager1.getFilename()+"',");
sb.append("'fileSize':").append(fileManager1.getFileSize()+",");
sb.append("'fileContentType':").append("'"+fileManager1.getFileContentType()+"',");
// sb.append("'uploadUser':").append("'"+fileManager1.getUploadUser().getPersonName()+"',");
sb.append("'uploadTime':").append("'"+fileManager1.getUploadTime()+"',");
sb.append("'isDirectory':").append("'"+fileManager1.getIsDirectory()+"',");
sb.append("'isFile':").append("'"+fileManager1.getIsFile()+"',");
sb.append("},");
}
}
if(sb.lastIndexOf(",")>0){
sb=new StringBuilder(sb.substring(0,sb.lastIndexOf(",")));
}
sb.append("]");
System.out.println(sb.toString());
getResponse().setContentType("text/html;charset=UTF-8");
getResponse().getWriter().write(sb.toString());
return null;
}

关于这个问题,首先要肯定的是在你的action中session已关闭。
那么你所要做的是进行调试。
找出在openSessionInViewFilter中是否正确步入,
或者session是在那里被人为关闭了。

如果你觉得麻烦而不愿意调试的话,我还有一个办法,使是强制加载。
在session尚未关闭的时候使用Hibernate.initialize(a)。那么就会将a强制为游离态时也可以使用的实体。

如上面改为:
public List getFileManagerByParentId(int id){
[code="java"]List list=this.getSession().createQuery(" from FileManager where parentDirectory="+id+" ").list();

for(list){
Hibernate.initialize(list.i);
}

return list;
} [/code]

将上面的伪码换为java语句就应该可以了

提问的时候最后把错误信息 也贴一下! :arrow:

web。xml 配置这个了没?

openSessionInViewFilter

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter



openSessionInViewFilter
.do


openSessionInViewFilter
.jsp

[quote]public class FileManagerDAO extends HibernateDao { [/quote]

HibernateDao 这个里面是否有 session 或者sessionfactory 的注入呢?检查下!

不是很复杂的话 给我发过来!我帮你看看! (项目 复杂就...我也没太多时间!

[code="java"]System.out.println(fileManager.getId());
sb.append("{");
sb.append("'id':").append(""+fileManager.getId()+",");
sb.append("'fileName':").append("'"+fileManager.getFilename()+"',");
sb.append("'fileSize':").append(fileManager.getFileSize()+",");
sb.append("'fileContentType':").append("'"+fileManager.getFileContentType()+"',");
// sb.append("'uploadUser':").append("'"+fileManager.getUploadUser().getPersonName()+"',");
sb.append("'uploadTime':").append("'"+fileManager.getUploadTime()+"',");
sb.append("'isDirectory':").append("'"+fileManager.getIsDirectory()+"',");
sb.append("'isFile':").append("'"+fileManager.getIsFile()+"',");
sb.append("'childFiles':");
sb.append("''");
sb.append("}");
/* sb.append("{");
sb.append("'id':").append("1,");
sb.append("'fileName':").append("'呵呵',");
sb.append("'parentDirectory':").append("-1");
sb.append("}");*/ [/code]

将字符串中的内容放到一个jsp页面中,再然后用action跳过去试试。

或者试试将web.xml改为:
[code="xml"]
openSessionInViewFilter

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter



openSessionInViewFilter
/*
[/code]