0

spring-security クラスによって典型的な自動生成があります。+ 1 つのクエリで UserRoles (テーブル結合) と一緒に Roles を選択したいので、fetch: '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' ディレクティブを無視するのはなぜですか? それはどういうわけか春のセキュリティに依存していますか?

4

1 に答える 1

0

公式ドキュメントを解釈すると、ユーザー(一意でない属性メソッド)および一意の結果(getまたはfindByの一意の属性メソッド)fetchに対して複数選択を行うときにgrailsによって使用されますfindBylazy

公式文書:

道を試しましたlazyか?

別の可能性は、Spring-Security 自体の実装に関するものであり、Java 実装のポーテージであり、gorm からの情報を知らない (おそらく Java コードのみを翻訳する) ことです。

于 2013-01-13T00:40:34.957 に答える