Grails设置了3个类的映射表

时间:2014-09-23 06:36:10

标签: grails gorm grails-domain-class

我是grails的新手。我有3个班级作为follws

class Cycle 
{
    int year
    int quarter
}

class User
{
    String username, password           
}           

class Role
{
    String roleName 
} 

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

这样的映射表

enter image description here

查找特定周期中所有角色属于员工的内容。 如何在这些类之间设置正确的关系以解决这个问题,这样如果我有一个cyle和一个用户,我就可以找出用户在该循环中所拥有的所有角色 如果我有一个用户,我可以找到他所涉及的所有周期中他在每个周期中的角色

2 个答案:

答案 0 :(得分:0)

发表评论。 您应该在用户和周期之间创建一个表

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*/)

答案 1 :(得分:0)

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

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
    }
}