【问题标题】:Grails GORM cascade delete mappingGrails GORM 级联删除映射
【发布时间】:2014-05-08 16:39:26
【问题描述】:

如何通过外键的GORM映射在数据库级别实现on delete cascade

我不是指应用程序级别的级联删除(由 GORM 完成的顺序删除)。

【问题讨论】:

  • 你用的是什么数据库?

标签: hibernate grails grails-orm


【解决方案1】:

尝试在您的域类中使用 cascade: 'all-delete-orphan' 添加静态映射

例如

class Parent {
hasOne = [child: Child]

...

 static mapping = {
  child cascade: 'all-delete-orphan'
 }


}

class Child {
 belongsTo = [parent: Parent]
}

如果你有时间看看这个:http://grails.org/doc/2.3.7/guide/GORM.html#cascades

希望对你有帮助

【讨论】:

  • 如问题所述,它在 ORM 级别,而不是数据库级别。
【解决方案2】:

GORM 是一个对象关系映射器,它的实现和职责在应用程序的应用层内。您要求由您的 RDBMS(Postgres 或 MySQL)处理级联删除的请求不在 GORM 的职责范围内。

但是,完全可以使用触发器在 RDBMS 中实现级联行为。有关如何完成的,请参阅相应的文档。此外,您将需要禁用 hibernate 的二级缓存(因为这些更改,您的数据库将与 hibernate 不同步)。

最后,为了帮助您维护触发器,您可以使用 Grails 的数据库迁移插件/功能。

祝你好运,但要小心,因为你正在绕过 GORM/Hibernate/Grails。

【讨论】:

  • grails db 迁移工具的问题,请求支持迁移中的 db 级级联:github.com/grails-plugins/grails-database-migration/issues/67
  • 为什么? cascade 特性如果是 GORM 的一个特性并且没有在数据库级别实现它。它通过 GORM 并不会影响架构(因为并非所有数据库都支持这样)。
  • DB 迁移工具读取 GORM 并将其转换为 sql 以更新底层数据库表示。我的 gorm 模型中唯一没有转换为 sql 迁移的是级联功能。当我使用 postgres 方言时,让 db 迁移工具支持 postgres 级联会很有用。我可以手动将它添加到我的数据库迁移约束中,但我希望该工具能够处理它。
  • 那么您应该将其作为功能请求提交,而不是错误报告。 GORM 中的cascade 行为从未打算在数据库级别实现。
  • 公平点。我最初认为这是数据库迁移中的一个错误。我会将问题更新为功能请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多