Grails的Many-to-Many改良

标准的M-M做法:

class User{
static hasMany=[roles:Role]
String name
}

class Role{
static belongsTo = User
static hasMany=[users:User]
String name
}

使用方法:

Role roleUser=new Role(name: "ROLE_USER").save()
Role roleAdmin==new Role(name: "ROLE_ADMIN").save()

User user1= new User(name: "bruce_lin_chn")
user1.addToRoles(roleUser)
user1.save()

存在的问题:
[list]
[*]hasMany会在User和Role中创建Set(org.hibernate.collection.PersistentSet)
[*]为了唯一性检查,增加一个Role到User要求加载所有用户角色的实例和所有其他拥有该权限的用户
[*]存在乐观锁异常的风险
解决方案:

class User{
String name
}

class Role{
String name
}

class UserRole implements Serializable{
User user
Role role
static mapping = {
table 'user_role_mapping'
version false
id composite: ['user', 'role']
}

static Set<Role> getRoles(User user){
UserRole.findAllByUser(user).collect{it.role} as Set
}

static boolean hasRole(User user, Role role){
return UserRole.countByUserAndRole(user,role)>0
}

static beforeDeleteUser(User user){

}

static beforeDeleteRole(Role role){

}
}


[list]
[*]
[/list]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值