【问题标题】:Grails Datasources "Cannot add or update a child row: a foreign key constraint fails"Grails 数据源“无法添加或更新子行:外键约束失败”
【发布时间】:2012-03-31 02:21:53
【问题描述】:

我在我的应用程序中使用 Grails Datasources 插件,并且在持久化引用只读关联(父)类的 (chidl) 域类时遇到问题。例如:

/* Parent domain class; a read-only datasource using the Datasources plugin */
class Parent {
  //...Some fields
}

/* Child domain class, referencing the parent class */
class Child
  // Some fields
  static hasOne = [parent:Parent]
}

当我尝试坚持我的子类时,我收到了这个错误

Cannot add or update a child row: a foreign key constraint fails 
(`foo`.`child`, CONSTRAINT `FK38A5EE5F707D1A2B` 
FOREIGN KEY (`id`) REFERENCES `parent` (`id`))

我注意到当启动时创建表时,Grails 会从(只读)datasource A 到我的本地(可写)datasource B 创建引用表的本地空副本。是否可以改为引用此表(及其新创建的 FK)?如果是这样,为什么它不对实际数据源(即datasource A)强制执行 FK 约束?

我对 Grails 还很陌生,在其他任何地方都无法找到此特定问题的解决方案,如果这听起来像个愚蠢的问题,请见谅

【问题讨论】:

    标签: hibernate grails datasource


    【解决方案1】:

    插件不支持跨数据库的这种关系。 GORM 可能不知道另一个域类存在于另一个数据库中。

    解决此错误的方法是存储对父行的引用,例如:

    class Child{
          long parentId      
          Parent getParent(){
               Parent.get( parentId )
          }
    }
    

    看到这个:http://markmail.org/message/omllq46sn3d2l6ah

    【讨论】:

    • 感谢您的建议和链接。你能建议我的二传手会/应该是什么样子吗?我不需要父母参考吗?此外,我注意到,尽管将该字段标记为瞬态,但当我删除并重新创建数据库/表时,它仍然在我的只读数据源中创建了对父表的外键引用 - 为什么?
    • 你的 setter 就像 void setParent( parent ){ parentId = parent.id }
    • 它可能会创建父级,因为 dbCreate 是在数据源中设置的,而 GORM 并不那么聪明。
    • 再次感谢托马斯。不幸的是,我仍然收到 FK 错误。这是我的子类:class Child { ... static transients = ['parentId'] Parent getParent(){Parent.get(parentId)} void setParent(p){this.parentId=p.id} 我在只读数据源上设置了 dbCreate('update') 属性
    • 你的瞬态应该是父级。
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多