我有一个奇怪的问题。
我有两个域类User
and Post
与字段:
class User {
String name
static hasMany = [posts: Post]
static constraints = { }
}
and
class Post {
String content
long date = System.getTimeInMillis()
static constraints = { }
static belongsTo = [user: User]
static mapping = {
version: 'false'
}
}
控制器代码是:
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
,它会抛出空指针异常,但之后工作正常。
这是我遇到的例外
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
在用户域类中,因为hasMany
关系为posts
, posts
是一个列表Post
对象,那么在获取空列表的大小时不应该出现空指针异常,而应该为零。
任何帮助表示赞赏
当你映射这样的集合时,hasMany
声明添加一个类型字段Set
具有指定的名称(在本例中posts
)到你的班级。但它不会初始化该集合,因此它最初为空。你打电话时addToPosts
它检查它是否为 null,并在必要时创建一个新的空 Set,并将 Post 添加到集合中。但如果你不打电话addToPosts
或者显式初始化该集合,它将为空。
当你加载一个User
从数据库中,Hibernate 将填充所有字段,并且集合包含在其中。它创建一个新的 Set(一个修改感知的PersistentSet
) 是空的,如果有实例则向其中添加实例。呼唤save()
但不会从数据库重新加载实例,因此空集仍然为空。
为了让类在新类和持久类时都以相同的方式运行,您可以向类中添加一个字段,就像 Rob 在他的答案中所示,初始化为一个空集(Set posts = []
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)