2013-01-11 2 views
0

나는 스프링 보안 클래스에 의해 전형적으로 자동 생성된다. + 하나의 쿼리에서 UserRoles (테이블 조인)와 함께 Roles를 선택하려고하므로 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는 고유의 결과를 당신이 당신의 사용자 (findBy이 아닌 고유 한 속성 방법)에 대한 다중 선택을 할 때 Grails가 사용되며, lazy한다 (취득 또는 findBy 고유의 속성 방법)

공식 문서 : 게으른

lazy 방법을 시도 했습니까?

또 다른 가능성은 (단지 아마, 자바 코드를 번역) 자바 구현의 운반이 무엇인지 스프링 보안 자체의 구현 및 GORM로부터 정보를 알 수 없습니다에 관한

그것이 설계되었다처럼 설계된 이유가있다