在grails中使用GORM进行域建模,如何表示关联

时间:2015-10-20 04:22:45

标签: grails associations gorm model-associations

我正在学习grails,我想出了一个用例。在我的用例中,产品有很多用户,每个用户可以有很多角色。

这是我的产品类:

class Product {

    String name
    String description
    String vision
    Date startDate
    Date endDate

    static hasMany = [users : User, contributors : User, watchers : User, approvers : User]
    static belongsTo = User

    static constraints = {
    }
}

这是我的用户类:

class User {

    static constraints = {
    }

    String fullName
    String email

    static hasMany = [roles : Roles, products : Product]
}

以下是角色枚举:

public enum Roles {
    PRODUCTOWNER ('ProductOwner'),
    APPROVER ('Approver'),
    CONTRIBUTOR ('Contributor'),
    WATCHER ('Watcher')
}

我的问题是关于产品和用户之间的关联。我想表示一个产品可以有许多不同角色的用户这一事实。此外,每个用户可以是多个产品的一部分,在每个产品中具有不同的角色。这是表达这种关系的正确方法吗?此外,我应该能够删除和添加用户的产品,反之亦然。这也意味着,用户可以在角色之间继续前进,也可以进出产品。在这种情况下,我可能不希望级联发生。如何防止自动级联发生在这种关系的CRUD操作中?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为,与User.groovy中的角色和产品不同,如果您创建一个像UserProductRole这样的独立域,那就更好了。正如您所说,用户将在不同的产品中扮演不同的角色,然后创建一个单独的域在业务用例和查询中更有意义

class UserProductRole{

    Role role

    static belongsTo = [user:User,product:Product]

    static constraints = {
        user (unique:['product','role']
    }
} 

您可以创建复合键,但我通常不会使用它,因为它会使查询变得困难。

现在您需要更改用户和产品中的hasMany,如下所示

[userProducts:UserProductRole]而不是拥有用户或产品