Grails 当验证失败时,我会收到(发生异常后不要刷新会话)错误消息,为什么?
我有一个名为Grails 当验证失败时,我会收到(发生异常后不要刷新会话)错误消息,为什么?,grails,gorm,Grails,Gorm,我有一个名为Project的域类: class Project { static hasMany = [ tasks : Tasks , users : User ] static belongsTo = User String name static constraints = { name(nullable:false,unique:true, size:5..20)
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
}
}
我使用以下代码保存项目
实例:
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)
}
如果我给出一个通过域类验证的项目
名称
,上面的代码就可以正常工作。但是如果我将失败
作为项目
名称
(域类验证失败),我会得到如下错误:
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非常陌生,我不知道为什么会发生这种错误。我怎样才能摆脱这个错误
提前谢谢
addToUsers()
需要已经保存的对象,因为它需要填充ID才能建立关系。您应该在之后调用此方法。save()
addToUsers()
需要已保存的对象,因为它需要填充ID才能建立关系。您应该在.save()
之后调用此方法如果删除显式刷新调用,是否仍会得到异常?那么是save()而不是save(flush:true)?@Gregg:Ya我试过了,它会导致同样的错误。但是我发现问题在于这个projectInstance.addToUsers(user)
行。当我把这行注释掉时,一切都正常。但我不知道如何保持这条线,并仍然从错误中逃脱!addToUsers()需要已保存的对象,似乎需要填充ID才能建立关系。你能在.save()之后尝试调用这个方法吗?@IgorArtamonov:你的权利。这是个错误。你为什么不能给我一个答案,我会接受的?这只是一个想法,因为我在保存
:)之前从未尝试过添加addTo
),我将其添加为应答如果您删除显式刷新调用,您仍然会得到异常吗?那么是save()而不是save(flush:true)?@Gregg:Ya我试过了,它会导致同样的错误。但是我发现问题在于这个projectInstance.addToUsers(user)
行。当我把这行注释掉时,一切都正常。但我不知道如何保持这条线,并仍然从错误中逃脱!addToUsers()需要已保存的对象,似乎需要填充ID才能建立关系。你能在.save()之后尝试调用这个方法吗?@IgorArtamonov:你的权利。这是个错误。你为什么不能给我一个答案,我会接受的?这只是一个想法,因为我在保存
之前从未尝试过将添加到
:)我将其添加为答案虽然我很高兴这解决了您的问题,但我不确定答案是否100%准确。我的代码接受一个未保存的对象并添加其他未保存的对象,然后hibernate负责以正确的方式保持它。我认为在您的例子中,问题具体是因为您将一个持久化对象添加到一个非持久化对象的集合中。grails似乎在添加之前也尝试保存它,但在验证时失败,因此,他此时没有有效的id AddTo*保存作为参数传递的关联,因为如果使用“static belongsTo…”,级联是以这种方式设置的。文档的第一行清楚地表明:虽然我很高兴这解决了您的问题,但我不确定答案是否100%准确。我的代码接受一个未保存的对象并添加其他未保存的对象,然后hibernate负责以正确的方式保持它。我认为在您的例子中,问题具体是因为您将一个持久化对象添加到一个非持久化对象的集合中。grails似乎在添加之前也尝试保存它,但在验证时失败,因此,他此时没有有效的id AddTo*保存作为参数传递的关联,因为如果使用“static belongsTo…”,级联是以这种方式设置的。文档的第一行清楚地说明: