2013-12-18 26 views
0

我正在一個grails應用程序,具有用戶和任務之間的一對多關係。當我創建一個任務時,我得到一個錯誤:不能添加到一對多的關係在休眠lazyInitializationException

class [class app.Task]類的屬性[user]不能爲null或 無法懶惰地初始化一個角色集合:app.User.tasks,no session或會話已關閉

我能夠在引導程序中成功地將任務保存到用戶,但無法在TaskController中這樣做。

我敢肯定,我有一行代碼錯了,想知道它是什麼。我的代碼如下。

def save() { 
    def taskInstance = new Task(params) 
    println "attempting to save ${session.user.toString()}" 

    println "adding task to user" 
    def tasks = session.user.getTasks() 
    println "got tasks" 

    println "adding task to user" 
    session.user.addToTasks(taskInstance) <--error here 
    println "task added successfully" 


    if (!taskInstance.save(flush:true)) { 
     println "task saved and flushed" 

     render (view: "create", model: [taskInstance: taskInstance]) 
     return 
    } 

    flash.message = message(code:'default.created.message', 
     args: [message(code: 'task.label', default: "Task"), taskInstance.id]) 
    redirect(action:"show", id:taskInstance.id) 
} 
+0

其實,再次查看您的示例控制器代碼,什麼是session.user?它是你的用戶域的實際實例嗎?這似乎很奇怪...通常你會攜帶user.id沒有綁定的實例。 –

+0

session.user是一個用戶域對象,我在登錄時設置了它。將它更改爲session.user = loggendInUser.id更好嗎? –

回答

1

直接使用存儲在Http Session中的對象通常不是一個好主意。我會做的是以下幾點:

def save() { 
    def user = User.get(session.user.id) 
    // or 
    def user = session.user.merge() // not 100% this would work right 

    ... all your other code 

} 

原因是,用戶從Hibernate的Session分離,你需要一個Hibernate Session對象全部毅力和善良格姆正常工作。

+1

不是最有可能的,絕對是:) –

+0

謝謝!做到了! –