2015-10-15 54 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(); 
}