没有joinTable的单向OneToMany关系

时间:2013-08-05 05:13:27

标签: grails mapping gorm

为了在映射单向OneToMany关系时实现外键列(没有joinTable),我按照Grails(版本2.2.3)参考文档,section 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)
    }

}

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

2 个答案:

答案 0 :(得分:11)

你几乎就在那里,你有两半的映射,但你需要它们才能正常工作。这不是一个记录良好的功能,但我之前使用过它,它肯定有用(例如没有连接表)。所以在你的One课程中,

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

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

此外,您可以在您的Many类中从技术上添加belongsTo 而不使用后引用,您仍然可以拥有真正的单向但具有级联操作的附加好处(映射到一堂课)如果你需要的话。

答案 1 :(得分:0)

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

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

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

如果要从那些集合中删除多个,请添加:

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