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

为什么grails在第一次访问hasMany关系时抛出空指针异常?,grails,gorm,Grails,Gorm,我有一个奇怪的问题。 我有两个带有字段的域类User和Post: class User { String name static hasMany = [posts: Post] static constraints = { } } 及 控制器代码为: class UserController { def addUser = { def user if (User.count() == 0) { user = new User() user

我有一个奇怪的问题。
我有两个带有字段的域类
User
Post

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

控制器代码为:

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
在用户域类中,
的coz对于
posts
有很多关系,
posts
是一个
Post
对象的列表,那么在获取空列表的大小时不应该有空指针异常,而应该是零


您可以通过在映射旁边显式声明集合属性(带有值)来防止出现这种情况:

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

您可以定义所需的集合类型。默认值是“代码> SET”,但如果您需要维护订单,则可以考虑“代码>列表或<代码> SoReSETTP>代码> .< /P> < P>当您对这样的集合进行映射时,有许多 >添加一个类型为“代码> > SET
的字段,并将指定的名称(在本例中为“代码> POST <代码> >”)添加到您的类中。但它不会初始化集合,因此它最初为null。当您调用
addToPosts
时,它会检查它是否为null,并在必要时创建一个新的空集,然后将Post添加到集合中。但如果不调用
addToPosts
或显式初始化集合,则该集合将为null

当您从数据库加载
用户
时,Hibernate将填充所有字段,集合包含在其中。它创建一个新的空集合(一个修改感知的
PersistentSet
),并向其中添加实例(如果有的话)。调用
save()
不会从数据库重新加载实例,因此空集仍然是空的


要使类在新的和持久的情况下以相同的方式运行,您可以向类中添加一个字段,如Rob在回答中所示,初始化为一个空集(
set posts=[]

是的,默认值是设置的,但我使用了List,因为我将“posts”解释为具有顺序的内容。无论如何,SortedSet可能更合适。
class User {
    String name
    Set posts = []
    static hasMany = [posts: Post]
}