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' ディレクティブを無視するのはなぜですか? それはどういうわけか春のセキュリティに依存していますか?