8

为了在映射单向 OneToMany 关系时实现外键列(无 joinTable),我按照 Grails(2.2.3 版)参考文档第 6.5.2.1 节OneToMany 映射的步骤进行操作,其中指出

对于单向关联,需要在关联本身上指定外键。例如,给定 Person(替换为 One)和 Address(替换为 Many)之间的单向 OneToMany 关系,以下代码将更改 Many 表中的外键

class One {

    static hasMany = [manyCollection:Many]
    static mapping = {
        manyCollection(column:"ONE_ID")
    }

}

但是,当我跑步时

One one = new One()
one.addToManyCollection(new Many())

one.save()

我进入控制台

insert 
into
    one
    (id, version) 
values
    (null, ?)

insert 
into
    many
    (id, version) 
values
    (null, ?)

insert 
into
    one_many
    (one_many_collection_id, many_id) 
values
    (?, ?)

注意 Grails 创建了一个名为 one_many 的 joinTable。所以,我的问题是:这是一个错误还是其他什么?我应该怎么做才能摆脱 joinTable ?

即使我使用类似的东西

class One {

    static hasMany = [manyCollection:Many]
    static mapping = {
        manyCollection(joinTable:false)
    }

}

如此处突出显示,我得到相同的输出

4

2 回答 2

11

你快到了,你有两半的映射,但你需要两者才能正常工作。这不是一个有据可查的功能,但我以前使用过它并且它确实有效(例如,没有连接表)。所以在你的一堂课中,

class One {
  ..
  static mapping = {
    manyCollection column: "ONE_ID", joinTable: false
  }
}

注意:在进行映射更改时退出、清理和重新启动 grails 可能是个好主意。当一个简单的 grails clean 是解决方案时,我已经失去了很多时间。

此外,从技术上讲,您可以在 Many 类中belongsTo 不使用反向引用进行添加,并且如果您需要的话,您仍然可以拥有真正的单向但具有级联操作(映射到 One 类中)的额外好处。

于 2013-08-05T18:02:16.127 回答
0

以下设置将实现您正在谈论的内容:

class One {
   static hasMany = [manyCollection: Many]
}

class Many {
   static belongsTo = [one: One]
}

如果您想删除从集合中删除的多个,请添加:

  class One {
      static mapping = {
          manyCollection cascade: 'all-delete-orphan'
      }
  }
于 2013-08-05T13:05:35.827 回答