Grails 不可连接的单向一对多关系

Grails 不可连接的单向一对多关系,grails,mapping,gorm,Grails,Mapping,Gorm,为了在映射单向OneToMany关系时实现外键列(无joinTable),我按照Grails(版本2.2.3)参考文档OneToMany mapping中的步骤进行操作,其中 对于单向关联,需要在关联本身上指定外键。例如,给定Person(由一个替换)和Address(由多个替换)之间的单向OneToMany关系,以下代码将更改Many表中的外键 然而,当我跑的时候 One one = new One() one.addToManyCollection(new Many()) one.save

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

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

然而,当我跑的时候

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\u many的连接表。所以,我的问题是:这是一个bug还是别的什么?我该怎么做才能摆脱joinTable

甚至当我使用类似

class One {

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

}

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

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

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

class Many {
   static belongsTo = [one: One]
}
如果要删除从“一”集合中删除的“多”,请添加:

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

你差不多到了,你有两个映射的一半,但是你需要两个,它才能正常工作。这不是一个有很好文档记录的特性,但我以前使用过它,它肯定能工作(例如,没有联接表)。所以在你的一节课上

class One {
  ..
  static mapping = {
    manyCollection column: "ONE_ID", joinTable: false
  }
}
注意:在进行映射更改时,退出、清理并重新启动grails可能是一个好主意。当一个简单的grails clean是解决方案时,我已经浪费了很多时间


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

您的解决方案是一种双向关系,不是单向的参考文献是错误的。我们应该使用joinTable:false而不是column。如果我只使用文档中所述的列,将创建一个joinTable。
class One {
  ..
  static mapping = {
    manyCollection column: "ONE_ID", joinTable: false
  }
}