gpt4 book ai didi

grails - grails hasMany映射表-如何使它们使用ID(即,将它们以第一范式形式放置)

转载 作者:行者123 更新时间:2023-12-02 14:00:59 25 4
gpt4 key购买 nike

问题是Galera集群要求所有表都具有ID PK。 Grails映射表没有ID,没有PK,甚至都不是第一范式。它似乎甚至没有停止重复的条目。

例如。:

Class Role {
String description
static hasMany [permissions :Permission]
}

Class Permission {
String name
}

这将创建具有以下列的表role_permission:
  • role_permissions_id
  • Permission_id

  • 没有ID!

    我们尝试使用liquibase在表上放置一个ID,但是每次使用更新生成的版本对数据库进行比较时,它都会再次被删除-我们需要更永久的修复。

    我假设我们可以创建自己的映射表:
    class role_permission_custom {
    Permission permission
    Role role
    }

    但是我们如何获得grails 2.5来使用它呢?

    我们不需要任何自动删除级联的东西,但我们希望现有的UI能够正常工作...

    我们尝试了以下方法:
    Class Role {
    String description
    static hasMany [permissions :Permission]
    static mapping = {
    permissions joinTable: [name: "role_permission_map", key: "role_id"]
    }
    }

    class RolePermissionMap {
    Permission permission
    Role role
    }

    但这根本不起作用。首先,当我们创建映射时,它不会保存映射(并且不会产生任何类型的错误):
                portalPermission = new Permission(...)
    new Role(description: "user",
    permissions: [portalPermission, playerViewPermission, transactionsPlayerView]).save(failOnError: true)

    其次,该项目现在给出:“HeuristicCompletionException:启发式完成:结果状态是混合的”,并且不会启动,我们尚未弄清。

    我也尝试过这个:
    class RolePermissionMap {
    Permission permission
    Role rolePermissions
    static mapping = {
    version false
    }
    }

    有趣的是,稍后在 bootstrap 中,我得到了:
    Field 'role_permissions_id' doesn't have a default value

    最佳答案

    好的,我找到了一个可以正常工作的解决方案,事实证明这很容易,并且可以与spring安全性和我们的自定义身份验证一起使用!

    Class Role {
    String description
    static hasMany [permissions :Permission]
    static mapping = {
    permissions joinTable: [name: "role_permission_map", key: "role_permissions_id"]
    }
    }

    class RolePermissionMap {
    Permission permission
    Role rolePermissions

    static mapping = {
    version false
    rolePermissions unique: 'permission'
    }
    }

    现在,我们只需要更改为 bootstrap 中的角色分配权限的方式即可:
    portalPermission = new Permission(...).save(failOnError: true)
    Role role = new Role(description: "user").save(failOnError: true)
    role.addToPermissions(portalPermission).save(failOnError: true)

    并且该应用程序可以正常运行,在Galera映射表上具有正确的ID列,且没有重复项。

    关于grails - grails hasMany映射表-如何使它们使用ID(即,将它们以第一范式形式放置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32224056/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com