gpt4 book ai didi

grails - 为什么在第一次访问hasMany关系时grails抛出空指针异常?

转载 作者:行者123 更新时间:2023-12-03 12:06:42 25 4
gpt4 key购买 nike

我有一个奇怪的问题。
我有两个域类UserPost与字段:

class User {
String name
static hasMany = [posts: Post]
static constraints = { }
}


class Post {
String content
long date = System.getTimeInMillis()
static constraints = { }

static belongsTo = [user: User]
static mapping = {
version: 'false'
}
}

Controller 代码为:
class UserController {
def addUser = {
def user
if (User.count() == 0) {
user = new User()
user.name = "Manish Zedwal"
user.save(flush: true)
} else {
user = User.get(1)
}
println "Posts count: " + user.posts.size()
render "post count: " + user.posts.size()
}
}

首次访问url http://localhost:8080/test/user/addUser时,它会引发null指针异常,但此后工作正常。
这是我得到的异常(exception)
2011-08-04 15:41:25,847 [http-8080-1] ERROR errors.GrailsExceptionResolver  - Exception occurred when processing request: [GET] /test/user/addUser
Stacktrace follows:
java.lang.NullPointerException: Cannot invoke method size() on null object
at test.UserController$_closure2.doCall(UserController.groovy:18)
at test.UserController$_closure2.doCall(UserController.groovy)
at java.lang.Thread.run(Thread.java:636)

并第二次打印并呈现出精美的魅力
Posts count: 0

在用户域类中, hasManyposts关系的coz, postsPost对象的列表,因此在获取空列表的大小时不应有null指针异常,而应为零。

任何帮助表示赞赏

最佳答案

当您映射这样的集合时,hasMany声明将具有指定名称(在本例中为Set)的posts类型的字段添加到您的类。但是,它不会初始化集合,因此最初为null。当您调用addToPosts时,它会检查它是否为null,并在必要时创建一个新的空Set,并将Post添加到集合中。但是,如果您不调用addToPosts或显式初始化集合,则它将为null。

当您从数据库中加载一个User时,Hibernate将填充所有字段,并且其中包含了集合。它创建一个空的新Set(可识别修改的PersistentSet),并向其中添加实例。但是,调用save()不会从数据库中重新加载实例,因此null设置仍将为null。

为了使该类在新的和持久的时都具有相同的行为,可以向类中添加一个字段,就像Rob在他的答案中显示的那样,初始化为一个空集(Set posts = [])

关于grails - 为什么在第一次访问hasMany关系时grails抛出空指针异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6940002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com