【问题标题】:Grails 2.3.x upgrade yielding repeat hasMany relationshipsGrails 2.3.x 升级产生重复的 hasMany 关系
【发布时间】:2013-12-09 17:07:24
【问题描述】:

从 2.2.x 升级到 2.3.x 后,我的 Grails 项目出现了一些奇怪的行为。我有三种简单的域类型用于典型的 CMS 功能:帖子、类别、标签,这样一个帖子就有很多类别和标签。

static hasMany = [categories: Category, tags: Tag]

创建帖子时,用户从 g:select ...multiple="multiple" 中选择适用的类别。每个类别仅在多选中显示一次。但是现在查询某个类别的帖子会返回同一个帖子的多个条目。查看Grails创建的MySQL数据库连接表“post_category”,可以看到,确实有多个条目:

Post_categories_id | category_id 
-------------------|------------
30000              | 1
30000              | 1
30000              | 2
30000              | 2

有没有人见过类似的行为?修复建议?现在我只是通过 SQL 手动清理重复项。

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    我在升级时没有类似的行为。但是,老实说,我不记得 hasMany 关系是什么样的。几个问题/考虑:

    • 您的 hasMany 关系仍然是一个集合吗?您是否为 hasMany 关系的域类型实现了 hashCode() 和 equals()? IIRC,这应该强制执行唯一性。需要考虑的一件事是,如果无法在当前数据集上强制执行此唯一约束,则现在创建时将失败。话虽如此,您可以使用 SQL 查询清理当前数据集。

    • 看起来如果您根据 column1 和 column2 对它们进行分组,您将获得您正在寻找的数据集。您总是可以通过这种方式检索记录。有点脏,而且不理想,但它会让您在找到根本解决方案之前开始运作。

    我会继续环顾四周。如果您为 Post、Category 和 Tag 发布域,它可能会有所帮助。只有重要的部分(约束、静态 hasMany 映射和属性本身)是必要的。

    此外,您可以打开详细日志记录并查看创建新帖子时正在运行的 SQL 语句。我的猜测是这里正在发生。从创建帖子的视图到 post.save() 调用的流程片段也可能会有所帮助。

    【讨论】:

    • 实现 equals() 和 hashCode() 确实强制了唯一性,谢谢!我仍然有一个奇怪的行为,即在 UI 上取消选择类别时不会删除它们。对于任何面临这个问题的人,我在从 params 重建对象之前暂时放入了一个“postInstace.categories.clear()”。这可行,但仍然感觉不正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多