没有joinTable的单向OneToMany关系



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

对于单向关联,需要在关联本身上指定外键。例如,给定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。所以,我的问题是:这是一个bug还是其他什么?我该怎么做才能去掉joinTable?

即使我使用之类的东西

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

正如这里强调的那样,我得到了相同的输出

您已经差不多完成了,您有两部分映射,但您需要这两部分才能正确工作。这不是一个很好的文档功能,但我以前使用过它,它确实有效(例如,没有联接表)。所以在你的一级,

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

注意:在进行映射更改时,退出、清理并重新启动grails可能是个好主意。当一个简单的圣杯清洗是解决方案时,我已经浪费了很多时间来敲打我的脑袋。

此外,从技术上讲,您可以在Many类中添加belongsTo,而无需反向引用,并且您仍然可以获得真正的单向性,但如果您需要级联操作(映射在One类中),则可以获得额外的好处。

以下设置将实现您所说的内容:

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

如果你想删除很多,如果它从ones集合中删除,请添加:

  class One {
      static mapping = {
          manyCollection cascade: 'all-delete-orphan'
      }
  }

最新更新