2013-01-11 55 views
0

我有典型的自动生成的spring-security类。 +我想在一个查询中选择Roles和UserRoles(表连接),因此我添加了fetch:'join'。Grails spring-security UserRole - 角色提取:'join'

class User { 
    def springSecurityService 
    String username 
    String password 
    static hasMany = [userRoles: UserRole] 
    Set<Role> getAuthorities() { 
     if (!this.id) {return []} 
     def userAuthorities= userRoles*.role 
     return userAuthorities 
    } 
} 

class UserRole implements Serializable { 

    User user 
    Role role 
... 
    static mapping = { 
     table 'UserRole' 
     version false 
     id composite: ['role', 'user'] 
     user column: 'UserID' 
     role column: 'RoleID', fetch: 'join' 
    } 
class Role { 
    String authority 
    String description 

    static mapping = { 
     cache true 
     table 'Role' 
     id column: 'RoleID', generator: 'identity' 
     authority column: 'Authority' 
     description column: 'Description' 
    } 

但我仍然得到角色的初始化工作,只有当我访问它getAuthorities()。它会导致'N + 1'查询性能问题。为什么grails/hibernate忽略fetch:'join'指令?它在某种程度上取决于春季安全吗?

+0

有它的设计就像是在设计的原因第一名。 –

回答

0

正如我解释的官方文档,fetch所使用的Grails当你为你的用户(findBy非唯一属性的方法)做了多选,并lazy一个独特的结果(GET或findBy独特属性的方法)

正式文件:

你试过lazy的方法吗?

另一种可能性是关于实施春季安全本身的什么是Java实现的搬运,并知道从格姆任何信息(只能翻译的Java代码,也许)