0

我有两个域类的单向一对多关系:

package net.peddn

class User {
    static hasMany = [texts: Text]
    String username 
}

package net.peddn

class Text {

    long creator
    String title

    static constraints = {
        creator( nullable: true )
    }   
}

我的用户控制器如下所示:

package net.peddn

class UserController {

static scaffold = true

    def delete() {

        def userInstance = User.get(params.id)

        userInstance.texts.each { text ->
            text.creator = null
        }           

        userInstance.delete(flush: true)

}

我的 BootStrap.groovy 看起来像这样:

import net.peddn.Text
import net.peddn.User

class BootStrap {

    def init = { servletContext ->

    User user = new User(username: "username")

    user.save(flush: true)

    Text text1 = new Text(title: "titel 1", creator: user.id)

    Text text2 = new Text(title: "titel 2", creator: user.id)

    user.addToTexts(text1)

    user.addToTexts(text2)

    user.save(flush: true)

    }

    def destroy = {
    }

}

当我现在尝试删除我的用户时,我收到以下错误:

| Server running. Browse to http://localhost:8080/usertexts
| Error 2012-06-17 19:33:49,581 [http-bio-8080-exec-4] ERROR errors.GrailsExceptionResolver  - IllegalArgumentException occurred when processing request: [POST] /usertexts/user/index - parameters:
id: 1
_action_delete: Löschen
Stacktrace follows:
Message: null
    Line | Method
->>   21 | doCall    in net.peddn.UserController$_delete_closure1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     19 | delete    in net.peddn.UserController
|   1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    603 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run . . . in java.lang.Thread

如果我将代码更改为

text.creator = 0

在 UserController.groovy 中完美运行。

顺便说一句:我使用了这个域模型,因为我不希望在删除用户时删除 Text 对象。但我也想知道谁创建了 Text 对象。如果有人对此问题有更好的解决方案,请告诉我。

谢谢!彼得

4

2 回答 2

0

最后我找到了正确的提示。看来这是一个铸造问题。看:

升级到 Grails 2.0 时的 Groovy Primitive Type Cast Gotcha

因此,我将 Text 域类的原始“long”属性更改为其“盒装”版本“Long”:

package net.peddn

class Text {

    Long creator
    String title

    static constraints = {
        creator( nullable: true )
    }   
}

现在可以将属性设置为null!

感谢托马斯的帮助!

于 2012-06-18T10:01:59.857 回答
0

使用您当前的实现,请尝试是否可行:

    def delete() {

        def userInstance = User.get(params.id)

        userInstance.texts.each { text ->
            userInstance.removeFromTexts(text)
        }           

        userInstance.delete(flush: true)
    }

如果您想要双向关系 User-Texts 并且您不希望在删除用户时删除文本,您可以更改此行为。在此处查看有关 Hibernate 中级联的文档部分:自定义级联。您可以像这样更改映射:

class User {
    static hasMany = [texts: Text]

    static mapping = {
        texts cascade: "save-update"
    }
}
于 2012-06-17T21:00:03.373 回答