Grails 在构图方面如何使用 GORM(To HasMany 或 Not Many)



所以我有一个对象 人 比方说,有以下字段(为简单起见(

class Person{
String name
List<Address> addressList
}
class Address{
String streetNo
}

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

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()
})

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

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

respond Person.list()

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

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

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

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

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

  1. 关闭延迟加载以进行addresses

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

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

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

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

    @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' }

相关内容

  • 没有找到相关文章

最新更新