Grails 在组合方面如何使用 GORM(是否有 HasMany)

Grails How to work with GORM when it comes to composition (To HasMany or to not)

所以我有一个对象 Person 让我们说,具有以下字段(为简单起见)

class Person{
    String name
    List<Address> addressList
}

class Address{
    String streetNo
}

这通常是要走的路,但现在我正在使用 grails,我认为它应该是以下内容:

class Person{
    String name
    List addresses
    static hasMany = [addresses: Address]    
}

class Address{
    String streetNo
    static belongsTo = Person
}

我正在接收来自 HTTP 调用的数据,我正在尝试保存它:

    def persons = response.getAt("response").getAt("persons").collect()
    persons.forEach({ current ->
        def person = new Person(current)
        person.save()
    })

解析工作正常,因为当我在保存之前检查人员对象时,我可以看到地址被正确添加(起初没有保存并且没有 ID 但在保存之后,添加了一个 ID)

现在,当我想获取所有人时,我会做一个基本的

    respond Person.list()

我得到的所有详细信息都是正确的,但地址我只得到地址 ID,例如:

{
    id: 1,
    name: foo,
    addresses:[
    {id:1},{id:2}    
    ]
}

但我这里想要的是实际地址对象而不是它的id! 我还注意到,在多次检索 Person 列表后,地址列表变空了,我最终得到了地址:[]

我试图删除 hasMany 并返回到列表,但它也没有用,我浏览了官方文档,但没有什么比我已经尝试过的更能指出 and/or 提到的

有几种方法可以呈现您的 hasMany 参考:

  1. 关闭 addresses 的延迟加载:

    class Person{
        String name
        List addresses
        static hasMany = [addresses: Address]    
        static mapping = {
            addresses lazy: false
        }
    }
    

    因为您希望 addresses 表现得像 embedded 对象。

  2. 您可以通过显式调用它的道具来解析 person 中的每个 address

    def list = Person.list()
    list*.addresses*.streetNo
    respond list
    
  3. 使用 Jackson 注释

    @JsonAutoDetect(fieldVisibility = Visibility.PUBLIC_ONLY) // either for the class
    class Person{
        String name
    
        @JsonProperty // or for each prop
        List addresses
        static hasMany = [addresses: Address]    
    }
    

更新

  1. 如果使用mongo,则可以充分利用embedded

    class Person{
        String name
        List<Address> addresses    
        static embedded = [ 'addresses' ]
    }
    
    class Address{
        String streetNo
    }
    

亲自尝试添加

静态映射{获取:'join'}