我在使用 Grails MongoDB 插件在 MongoDB 中存储嵌入式文档/对象列表时遇到问题。我使用了第 3 章文档中给出的信息,但只得到了一个对象的嵌入工作。
出于测试目的,我在一个新的 Grails 项目中创建了两个域对象 Person 和 Address。它们看起来像这样:
class Person {
ObjectId id
String firstName
String lastName
Address address
List otherAddresses = []
static embedded = ['address', 'otherAddresses']
}
class Address {
String street
String postCode
String city
}
当我在 Bootstrap.groovy 中执行以下行时,它在 MongoDB 中存储了两个 Person 对象——它们都有一个正确的地址,但在 person1 中,otherAddresses 列表是“[ null ]”,而在 person2 中,otherAddresses 列表是“[ { “street”:”第二街道。164" , "city" : "纽约" , "postCode" : "13579"}]"
def address = new Address(street: "Mainstreet. 164", city: "New York", postCode:"12345")
def person1 = new Person(firstName: "John", lastName: "Doe")
person1.address = address
person1.otherAddresses.add(address)
println person1.otherAddresses // Result: "[mongoembeddedlisttest.Address : (unsaved)]"
person1.save()
person1.errors.allErrors.each { println it } // no errors
def person2 = new Person(firstName: "Jane", lastName: "Doe")
person2.otherAddresses += ['street': 'Second Street. 164', 'city': 'New York', 'postCode':'13579']
println person2.otherAddresses // Result: "[[street:Second Street. 164, city:New York, postCode:13579]]"
person2.save()
生成的数据库条目:
{ "_id" : { "$oid" : "521089461a150b20390d61c2"} , "address" : { "city" : "New York" , "postCode" : "12345" , "street" : "Mainstreet. 164"} , "firstName" : "John" , "lastName" : "Doe" , "otherAddresses" : [ null ] , "version" : 0}
{ "_id" : { "$oid" : "521089461a150b20390d61c3"} , "firstName" : "Jane" , "lastName" : "Doe" , "otherAddresses" : [ { "street" : "Second Street. 164" , "city" : "New York" , "postCode" : "13579"}] , "version" : 0}
进一步说明:
我正在使用纯 mongodb 方法(没有与 Hibernate 混合)
我正在使用运行 mongo db 2.4.4 的 Grails 2.2.1 在 Windows 8 机器上工作
Person 是 /grails-app/domain 中的域对象,Address 是 /src/groovy 中的“普通”groovy 类(我可以将它放在域文件夹中,但没有效果)
Config.groovy 中的所有内容都设置为可为空: grails.gorm.default.constraints = { '*'(nullable: true) }
BuildConfig.groovy 有插件入口: compile ":mongodb:1.3.0"
我究竟做错了什么?如何使用 Grails 机制存储嵌入对象的列表?