2012-03-11 51 views
0

我有一個域類名爲Project驗證失敗時我得到(發生異常後不刷新會話)錯誤消息,爲什麼?

class Project { 
     static hasMany = [ tasks : Tasks , users : User ] 
     static belongsTo = User 
     String name 
     static constraints = { 
       name(nullable:false,unique:true, size:5..20) 
       tasks(nullable:true) 
       users(nullable:true) 
     } 
     String toString() { 
       this.name 
     } 
} 

我用下面的代碼保存Project實例:

def save() { 
     def user = User.get(springSecurityService.principal.id) 
     def projectInstance = new Project(params) 
     projectInstance.addToUsers(user) 
     if (!projectInstance.save(flush: true)) { 
      render(view: "create", model: [projectInstance: projectInstance]) 
      return 
     } 
     flash.message = message(code: 'default.created.message', args: [message(code: 'project.label', default: 'Project'), projectInstance.id]) 
     redirect(action: "showCreatedProject", id: projectInstance.id) 
    } 

上面的代碼工作正常,如果我給一個Projectname,其傳遞域類驗證。但是,如果我看到這樣的信息failProjectname(其失敗的領域類確認)我得到一個錯誤這樣的:

Message: null id in mnm.schedule.Project entry (don't flush the Session after an exception occurs) 
Trace: Line | Method 
->> 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 908 | run  in  '' 
^ 662 | run . . in java.lang.Thread 

我很新的Grails的,我不知道爲什麼這個錯誤發生。我如何擺脫這個錯誤?

在此先感謝。

+0

之後調用這個方法如果你刪除了顯式刷新調用,你仍然會得到異常嗎?所以save()而不是save(flush:true)? – Gregg 2012-03-11 05:21:40

+0

@Gregg:雅我已經嘗試過了,它會導致相同的錯誤。但我發現問題出在這個'projectInstance.addToUsers(user)'行。當我評論這條線時,一切正常。但我不知道如何保持這一線,仍然逃避那個錯誤! – 2012-03-11 05:33:24

+1

addToUsers()需要已經保存的對象,似乎需要爲這個對象填充ID來建立關係。你可以嘗試在.save()之後調用這個方法嗎? – 2012-03-11 06:28:08

回答

3

addToUsers()需要已保存的對象,因爲它需要填充ID來建立關係。你應該在.save()

+0

感謝您的答案:) – 2012-03-11 15:46:01

+0

雖然我很高興這解決了您的問題,我不確定答案是否100%準確。我有一些代碼需要一個未保存的對象並添加其他未保存的對象,然後hibernate負責以正確的方式保存它。我認爲在你的情況下,這個問題是因爲你將一個持久對象添加到一個未持久對象的集合中。 – Gregg 2012-03-11 17:02:52

+0

似乎grails在添加之前也會嘗試保存它,但驗證失敗,所以此時他沒有有效的標識 – 2012-03-11 17:12:21

相關問題