【问题标题】:Grails self referencing domain class surprising save resultGrails 自引用域类令人惊讶的保存结果
【发布时间】:2017-07-30 21:14:54
【问题描述】:

我有一个这样的自引用域类:

class Person {
   String name
   Person father
   Person mother
}

我对父亲或母亲没有 hasMany 或其他限制

我有一项服务可以从 .csv 文件中插入新条目,如下所示

Person father = Person.findBy(newPersonFatherName)
Person mother = Person.findBy(newPersonMotherName)
Person newPerson = new Person(
    name: newPersonName,
    father: father,
    mother: mother)
newPerson.save()

执行此操作时,外祖母和祖父都设置为与 newPerson 相同的实例。

我可以通过在 save() 之前插入以下两行来消除这种情况

Person pgf = father.father
Person pgm = father.mother
Person mgf = mother.father
Person mgm = mother.mother

我想整个事情在某种程度上与级联保存有关,但我无法真正理解这个问题,而且我不愿意在代码中留下这样一个难以理解的解决方案。

有人可以帮忙吗?提前致谢!

【问题讨论】:

  • 不确定findBy 自己做了什么,不应该是findByName 吗?此外,名称不是很独特,一段时间后findByName 不会为您提供正确的结果,因为它会找到第一个匹配结果
  • 嗨,迈克,感谢 cmets。简而言之,以上是我真正拥有的简化版本,其中我已经摆脱了不相关的属性等。然后,在这种情况下,在这个例子中,“findBy”应该是“findByName”,正如你所说的(我使用 findBy 和其他属性真实的东西;您可以在 Grails 文档中找到它的示例)。至于唯一性,你的观点是正确的,在真实的东西中,我也在“findBy”中使用了其他属性。但最后,行为就是我提到的,即原始代码以某种方式错误地更新了祖父母。
  • 最好的办法是创建一个示例项目并将其链接到此处
  • 在 James Kleeh 的建议下,我创建了一个示例项目,它在最新的 Grails 2.5.5 下显示了相同的奇怪行为。我决定在 Grails 3.3.0 下尝试它,因为我很快就会把我的东西移到那里,问题似乎已经消失了。所以我将其标记为已解决。

标签: grails insert self-reference


【解决方案1】:

似乎这个问题在 Grails 2.5.5 和 Grails 3.3 之间已经消失了,所以我将把它标记为已回答并已解决。

【讨论】:

    猜你喜欢
    • 2018-01-09
    • 2022-06-11
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多