Grails 不为一对多关系填写外键字段

Grails does not fill in foreign-key field for one-to-many relation

我是 grails 的新手,在尝试不使用 join-table.

的情况下尝试定义一对多映射时一定遗漏了一些重要的东西

我有一个域对象 Foo

class Foo {

  static hasMany = [remarks: ChangeRemark]

  static mapping = {
      remarks column:'PART_REMARKS_ID', joinTable:false
  }
}

和另一个域对象 ChangeRemark

class ChangeRemark {

  String remark
  String name

}

我初始化了一个 Foo 对象,并向其添加了两个 ChangeRemark 对象

    ChangeRemark remark = new ChangeRemark(remark:"test", name:"t").save(flush:true)
    ChangeRemark remark2 = new ChangeRemark(remark:"test2", name:"y").save(flush:true)

    Foo foo = new Foo().save(flush:true)

    foo.addToRemarks(remark).save(flush:true)
    foo.addToRemarks(remark2).save(flush:true)

当我在 foo 上打印出备注的大小时,它确实是 2,但是外键的数据库列 PART_REMARKS_ID 在 ChangeRemarks table 为空。这意味着在我重新启动我的应用程序后,无法建立对象和备注之间的连接

让 grails 在 table 中插入 Foo id 我错过了什么?

为了避免连接 table 使用 belongsTo 创建从 ChangeRemarkFoo 的引用。

class Foo {

  static hasMany = [remarks: ChangeRemark]

}

class ChangeRemark {

  String remark
  String name

  static belongsTo = [foo: Foo]
}

执行此操作时,change_remark table 会获得一个 foo_id 外键。这意味着一个 ChangeRemark 实例只能引用一个 单个 Foo 实例;我假设这是你的意图。

这会改变您添加 ChangeRemark 的方式:

ChangeRemark remark = new ChangeRemark(remark:"test", name:"t")
ChangeRemark remark2 = new ChangeRemark(remark:"test2", name:"y")

Foo foo = new Foo()

foo.addToRemarks(remark)
foo.addToRemarks(remark2)

foo.save(flush: true)

基本上,Foo 负责持久化自身和 ChangeRemarks。