java - Grails在合成方面如何使用GORM(对HasMany或不对)

标签 java grails groovy gorm

所以我有一个对象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!
我还注意到,在检索“人员”列表几次后,地址列表变空了,最终得到地址:[]

我试图删除hasMany并返回列表,但是它也没有用,我查阅了官方文档,但是没有什么比我已经尝试过和/或提到的要多的了

最佳答案

有几种方法可以呈现hasMany引用:

  • 关闭addresses的延迟加载:
    class Person{
        String name
        List addresses
        static hasMany = [addresses: Address]    
        static mapping = {
            addresses lazy: false
        }
    }
    

    因为您希望addresses充当embedded对象。
  • 您可以通过显式调用其 Prop 来解析address中的每个person:
    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
    }
    
  • 关于java - Grails在合成方面如何使用GORM(对HasMany或不对),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61845236/

    相关文章:

    java - 如何从JPA中的 "dictionary table"中提取值

    c# - 是否可以一起使用 DDD 和 BDD?

    grails - 如何在 IntelliJ IDEA Grails 项目中为 groovy 方法获取 javadocs/groovydocs?

    java - Gradle:解包 war ,应用定制和重新包装 war

    unit-testing - grails单元测试中trait提供的覆盖方法

    java - 将数据写入字符串

    java - Java 机器人类的贝塞尔曲线

    Grails 解决某些依赖项非常慢

    html子元素中的grails/sitemesh布局设置属性(ng-app)

    grails - 在grails中创建页面结果列表