【问题标题】:Grails many-to-one cascaded deletion troubleGrails 多对一级联删除问题
【发布时间】:2015-04-27 01:42:52
【问题描述】:

给定以下域类:

class Location {
    String city

    static belongsTo = [ author: Author ]
}
class Author {
    String name
    Location location
}

当我这样做时:

def l = new Location(city: "Boston")
l.save()

def a = new Author(name: "Niall Ferguson", location: l)
a.save()

我可以使用a.delete() 删除我的作者,但如果我尝试使用l.delete() 删除我的位置,我会收到此错误:

org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [Location#17]

好的,让我从关联中删除要删除的对象,然后重试:

author.location = null // Assuming these two statements are the right way
location.author = null // to to this.

现在当我再次尝试l.delete() 时,我得到了这个:

ERROR util.JDBCExceptionReporter  - Referential integrity constraint violation: "FKAC2D218B9615BDBA: PUBLIC.AUTHOR FOREIGN KEY(LOCATION_ID) REFERENCES PUBLIC.LOCATION(ID) (18)";

那我做错了什么?在这种情况下甚至可以删除位置并保留作者吗?

【问题讨论】:

  • 使用static belongsTo = [ author: Author ] 配置,您将获得gorm docs 中解释的行为(示例b)。我假设通过明确设置belongsTo 配置,您想说没有作者就不能存在位置。我建议删除 belongsTo 关联,这样就可以在不删除引用作者条目的情况下删除位置。
  • @MarioDavid 删除belongsTo后,我仍然不能只删除该位置,我收到我在问题中发布的第二个错误,完整性约束违规。

标签: grails


【解决方案1】:

当我试图重现您的代码时,我的第一个错误出现在 l.save() 中。在您的课程中,您的域 Location 中的字段作者是必需的。在您的示例中,您无法保存没有作者的位置。 您应该经常检查 save() 的返回值或使用 failOnError: true 来发现类似的小错误。

话虽如此,在我看来,您正在建模一对一的关系。不是多对一,否则一个位置怎么会有一个作者? (我同意 grails 文档在这件事上有点混乱)

相反,我创建了以下类,假设作者有一个位置,但同一位置可以被许多作者引用。

class Author {
    String name
    Location location
}

class Location {
    String city
}

现在你的引用完整性约束违反了,基本上,如果不首先删除与该位置相关的所有作者,你就无法删除位置。

如果您希望删除级联工作,我会使用这样的双向一对多关系

class Author {
    String name
    static belongsTo = [location: Location]
}
class Location {
    String city
    static hasMany = [authors: Author]
}

关于您的最后一个问题,据我了解,您不能删除位置并保留作者。我假设许多作者与同一地点有关。那么,如果您删除该位置,那么所有作者对该位置的引用会发生什么情况?

【讨论】:

  • l.save() 给你一个问题?我没有这个问题。我实际上正在学习一个教程,这就是为什么我没有使用failedOnError: true。但是,您似乎确实回答了我的问题,即在这种情况下,即使我在尝试删除之前将其父作者的位置属性设置为 null,我也无法删除该位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 2019-07-31
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多