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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章