2015-10-15 63 views
0

我在DAO下一个方法:化妆方法参数永久休眠

public List<Project> getProjects(Category category) { 
     Session session = sessionFactory.openSession(); 
     session.merge(category); 
     return category.getProjects(); 
    } 

在我的应用程序类别是实体。还有项目也。 类别已有OneToMany的关系项目实体(表)。在这里,我尝试使用这个关系来获得所有具有相同类别的项目(我尝试了直接的SQL请求 - 它的工作没有问题)。当我尝试以这种方式来使用这种方法,我得到异常

failed to lazily initialize a collection of role: data.Category.project,could not initialize proxy - no Session 

我想这是因为里面的方法类别处于分离状态,我尝试再次管理但没有成功合并命令作出( ((还是我错了。有可能使用这样的代码?不使用直接的SQL命令。

回答

0

我认为这个问题是因为对象正在装载fetch = FetchType.LAZY strategy。你可能想了解what is Eager fetch and what is Lazy fetch.

基本上

LAZY =需要

EAGER时取=取立即

方案1(推荐):使用急于在Category类抓取策略:

public class Category { 
    ... 
    ... 
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    List<Projects> projects; 
    ... 
    ... 

    //Getters and Setters 

    /* P.S. - I don't know what's the actual code for your classes. 
    I just assumed it to be somewhat like this. Please post your code if you face 
    any further problem and I'll modify my answer accordingly. */ 
} 

你DAO看起来有点像这样:

public List<Project> getProjects(Category category) { 
     Session session = sessionFactory.openSession(); 
     session.merge(category); 
     List<Project> projects = category.getProjects(); 
     session.close() 
     return projects; 
} 

解决方案2:发送Session对象与类别类

这样,您将确保会话当你真正需要它来访问你的对象不是封闭的

public void yourMethod() { 
    //Declare Session in starting of your class where you're accessing the objects 
    Session session = sessionFactory.openSession(); 
    Category category = new Category(); 
    ... 
    ... 
    List <Project> projects = getProjects(category, session); 
    ... 
    ... 
    //Perform all of your operations here 
    ... 
    ... 
    session.close(); //Close session at the end 
} 

DAO方法沿

public List<Project> getProjects(Category category, Session session) { 
    session.merge(category); 
    return category.getProjects(); 
}