Java Grails如何在组合方面使用GORM(有很多还是没有)

Java Grails如何在组合方面使用GORM(有很多还是没有),java,grails,groovy,gorm,Java,Grails,Groovy,Gorm,比如说,我有一个objectperson,它有以下字段(为了简单起见) 我正在从HTTP调用接收数据,并尝试保存它: def persons = response.getAt("response").getAt("persons").collect() persons.forEach({ current -> def person = new Person(current) person.save() }) 解析工作正常,因为当我在

比如说,我有一个objectperson,它有以下字段(为了简单起见)

我正在从HTTP调用接收数据,并尝试保存它:

    def persons = response.getAt("response").getAt("persons").collect()
    persons.forEach({ current ->
        def person = new Person(current)
        person.save()
    })
解析工作正常,因为当我在保存person对象之前检查它时,我可以看到地址被正确添加(起初没有保存,没有ID,但保存后添加了ID)

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

    respond Person.list()
我得到的所有详细信息都是正确的,但地址我只得到地址ID,例如:

{
    id: 1,
    name: foo,
    addresses:[
    {id:1},{id:2}    
    ]
}
但是我想要的是实际的地址对象,而不是它的id! 我还注意到,在检索了几次人员列表后,地址列表变为空,最后我得到了地址:[]


我试图删除hasMany并返回列表,但也没有成功,我查阅了官方文档,但没有什么比我已经尝试和/或提到的内容更能说明问题。有几种方法可以呈现您的
hasMany
参考:

  • 关闭
    地址的延迟加载:

    class Person{
        String name
        List addresses
        static hasMany = [addresses: Address]    
        static mapping = {
            addresses lazy: false
        }
    }
    
    因为您更希望
    地址
    表现为
    嵌入的
    对象

  • 您可以通过显式调用
    个人
    中的每个
    地址
    ,来解析该地址:

    def list = Person.list()
    list*.addresses*.streetNo
    respond list
    
  • 使用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]    
    }
    
  • 更新

  • 如果您使用mongo,您可以充分利用
    embedded

    class Person{
        String name
        List<Address> addresses    
        static embedded = [ 'addresses' ]
    }
    
    class Address{
        String streetNo
    }
    
    班级人员{
    字符串名
    列出地址
    静态嵌入=['地址']
    }
    班级地址{
    字符串街号
    }
    
  • 亲自尝试添加


    静态映射{fetch:'join'}

    什么是Grails版本?
    地址列表可以有多长?你用的是什么数据库?我用的是内存H2(默认情况下),我相信我有最新的Grails版本(4+)。假设每个人最多可以有5个地址,每个地址有3-4个属性。(我不介意没有一个实际的地址表,因为我尝试嵌入它,但也不起作用)我切换到mongo,因为我觉得它更容易处理,我尝试了第一个和第三个解决方案,但没有运气,我仍然得到了地址的Id,而不是对象本身,关于第2点,由于某种原因,它看不到地址的道具。我假设在第4个表中,我不需要在不同的表中有地址,对吗?是的。所有地址都作为
    Person
    文档中的子文档数组。我在尝试使用mongo时遇到问题。4(只有当CurrentBSONType为DOCUMENT时才能调用readStartDocument,而不是当CurrentBSONType为INT64时)将尝试解决该问题并重试
    @JsonAutoDetect(fieldVisibility = Visibility.PUBLIC_ONLY) // either for the class
    class Person{
        String name
    
        @JsonProperty // or for each prop
        List addresses
        static hasMany = [addresses: Address]    
    }
    
    class Person{
        String name
        List<Address> addresses    
        static embedded = [ 'addresses' ]
    }
    
    class Address{
        String streetNo
    }