【问题标题】:Grails set mapping table of 3 classesGrails设置3个类的映射表
【发布时间】:2014-09-23 06:36:10
【问题描述】:

我是 grails 的新手。我有 3 个类如下

class Cycle 
{
    int year
    int quarter
}

class User
{
    String username, password           
}           

class Role
{
    String roleName 
} 

User 和 Role 表是独立的,它们分别存储所有员工和可用角色的详细信息。 员工在每个周期中可以担任多个角色。所以我想要一个像

这样的映射表

查找在特定周期中属于员工的所有角色。 我如何在这些类之间设置适当的关系来解决这种情况,以便如果我有一个循环和一个用户,我可以找出用户在那个循环中的所有角色 此外,如果我有一个用户,我可以找到他参与的所有周期以及他在每个周期中的角色

【问题讨论】:

    标签: grails grails-orm grails-domain-class


    【解决方案1】:

    在评论之后。 您应该在 User 和 Cycle 之间创建一个表

    class UserCycle
    {
        User user
        Cycle cycle
        static hasMany = [roles: Role]
    }
    

    角色类应如下所示:

    class Role
    {
         String roleName
         UserCycle userCycle
    }
    

    在代码中你可以这样引用:

    UserCycle uc = ...
    def roles = uc.roles.list(params) //list of roles
    def cycle = uc.cycle
    def user = uc.user
    

    添加

    uc.addToRoles(/*Your role*/)
    

    删除

    uc.removeFromRoles(/*Your role*/)
    

    【讨论】:

    • 稍微修正了你的假设。用户可以有很多循环和很多角色,循环可以有很多用户,并且特定循环中的每个用户可以有很多角色。希望this image 能帮助你理解我的意思。用户和角色表也是主表并且它们不应该属于任何其他表。也就是说用户和角色应该能够独立创建。创建新周期后,您应该能够选择现有员工和现有角色并将此用户角色组合分配给新创建的周期..
    • 因此,如果用户可以有多个周期并且周期可以有多个用户,您应该在它们之间创建一个表,例如 UserCycle,其中将包括对一个特定用户和一个角色的引用。
    【解决方案2】:

    您需要添加一个连接表(域类),用于存储特定周期中用户和角色之间的映射。这是一个此类的示例,其中包含一些可能有用的辅助方法

    class UserRole implements Serializable {
    
        User user
        Role role
        Cycle cycle
    
        static UserRole create(User user, Role role, Cycle cycle, boolean flush = false) {
            new UserRole(user: user, role: role, cycle: cycle).save(flush: flush, insert: true)
        }
    
        static boolean remove(User user, Role role, Cycle cycle, boolean flush = false) {
            UserRole instance = UserRole.findByUserAndRoleAndCycle(user, role, cycle)
            if (!instance) {
                return false
            }
    
            instance.delete(flush: flush)
            true
        }
    
        static void removeAll(User user) {
            executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user]
        }
    
        static void removeAll(Role role) {
            executeUpdate 'DELETE FROM UserRole WHERE role=:role', [role: role]
        }
    
        static void removeAll(Cycle cycle) {
            executeUpdate 'DELETE FROM UserRole WHERE cycle=:cycle', [cycle: cycle]
        }
    
        static mapping = {
            id composite: ['role', 'user', 'cycle']
            version false
        }
    }
    

    【讨论】:

    • 使用create方法
    • 好的。是否会在此表上删除循环或用户级联删除?
    • 不,如果你想这样做,你需要建立双向关系,并将 UserCycle 设置为所有者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2012-06-24
    相关资源
    最近更新 更多