better fetch for role mappings
This commit is contained in:
parent
b649dd39d9
commit
f50177996d
6 changed files with 22 additions and 14 deletions
|
@ -198,13 +198,14 @@ public abstract class ClientAdapter implements ClientModel {
|
|||
|
||||
@Override
|
||||
public Set<RoleModel> getScopeMappings() {
|
||||
TypedQuery<ScopeMappingEntity> query = em.createNamedQuery("clientScopeMappings", ScopeMappingEntity.class);
|
||||
TypedQuery<String> query = em.createNamedQuery("clientScopeMappingIds", String.class);
|
||||
query.setParameter("client", getEntity());
|
||||
List<ScopeMappingEntity> entities = query.getResultList();
|
||||
List<String> ids = query.getResultList();
|
||||
Set<RoleModel> roles = new HashSet<RoleModel>();
|
||||
for (ScopeMappingEntity entity : entities) {
|
||||
roles.add(new RoleAdapter(realm, em, entity.getRole()));
|
||||
em.detach(entity);
|
||||
for (String roleId : ids) {
|
||||
RoleModel role = realm.getRoleById(roleId);
|
||||
if (role == null) continue;
|
||||
roles.add(role);
|
||||
}
|
||||
return roles;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package org.keycloak.models.jpa;
|
|||
|
||||
import org.keycloak.models.ApplicationModel;
|
||||
import org.keycloak.models.AuthenticationLinkModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.RoleContainerModel;
|
||||
import org.keycloak.models.RoleModel;
|
||||
|
@ -302,13 +303,16 @@ public class UserAdapter implements UserModel {
|
|||
|
||||
@Override
|
||||
public Set<RoleModel> getRoleMappings() {
|
||||
TypedQuery<UserRoleMappingEntity> query = em.createNamedQuery("userRoleMappings", UserRoleMappingEntity.class);
|
||||
// we query ids only as the role might be cached and following the @ManyToOne will result in a load
|
||||
// even if we're getting just the id.
|
||||
TypedQuery<String> query = em.createNamedQuery("userRoleMappingIds", String.class);
|
||||
query.setParameter("user", getUser());
|
||||
List<UserRoleMappingEntity> entities = query.getResultList();
|
||||
List<String> ids = query.getResultList();
|
||||
Set<RoleModel> roles = new HashSet<RoleModel>();
|
||||
for (UserRoleMappingEntity entity : entities) {
|
||||
roles.add(realm.getRoleById(entity.getRole().getId()));
|
||||
em.detach(entity);
|
||||
for (String roleId : ids) {
|
||||
RoleModel roleById = realm.getRoleById(roleId);
|
||||
if (roleById == null) continue;
|
||||
roles.add(roleById);
|
||||
}
|
||||
return roles;
|
||||
}
|
||||
|
|
|
@ -16,7 +16,8 @@ import javax.persistence.NamedQuery;
|
|||
*/
|
||||
@NamedQueries({
|
||||
@NamedQuery(name="hasScope", query="select m from ScopeMappingEntity m where m.client = :client and m.role = :role"),
|
||||
@NamedQuery(name="clientScopeMappings", query="select m from ScopeMappingEntity m where m.client = :client")
|
||||
@NamedQuery(name="clientScopeMappings", query="select m from ScopeMappingEntity m where m.client = :client"),
|
||||
@NamedQuery(name="clientScopeMappingIds", query="select m.role.id from ScopeMappingEntity m where m.client = :client")
|
||||
})
|
||||
@Entity
|
||||
public class ScopeMappingEntity {
|
||||
|
|
|
@ -10,7 +10,8 @@ import javax.persistence.NamedQuery;
|
|||
*/
|
||||
@NamedQueries({
|
||||
@NamedQuery(name="userHasRole", query="select m from UserRoleMappingEntity m where m.user = :user and m.role = :role"),
|
||||
@NamedQuery(name="userRoleMappings", query="select m from UserRoleMappingEntity m where m.user = :user")
|
||||
@NamedQuery(name="userRoleMappings", query="select m from UserRoleMappingEntity m where m.user = :user"),
|
||||
@NamedQuery(name="userRoleMappingIds", query="select m.role.id from UserRoleMappingEntity m where m.user = :user")
|
||||
})
|
||||
@Entity
|
||||
public class UserRoleMappingEntity extends AbstractRoleMappingEntity {
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<property name="hibernate.connection.username" value="sa"/>
|
||||
<property name="hibernate.connection.password" value=""/>
|
||||
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
||||
<property name="hibernate.show_sql" value="false" />
|
||||
<property name="hibernate.show_sql" value="true" />
|
||||
<property name="hibernate.format_sql" value="true" />
|
||||
</properties>
|
||||
</persistence-unit>
|
||||
|
|
|
@ -234,7 +234,7 @@ public class AccessTokenPerfTest {
|
|||
@Test
|
||||
public void perfJaxrsClientLogin()
|
||||
{
|
||||
long ITERATIONS = 100;
|
||||
long ITERATIONS = 3;
|
||||
JaxrsClientLogin login = new JaxrsClientLogin();
|
||||
long start = System.currentTimeMillis();
|
||||
for (int i = 0; i < ITERATIONS; i++) {
|
||||
|
@ -252,6 +252,7 @@ public class AccessTokenPerfTest {
|
|||
long start = System.currentTimeMillis();
|
||||
BrowserLogin login = new BrowserLogin();
|
||||
for (int i = 0; i < ITERATIONS; i++) {
|
||||
//System.out.println("----------------------------------");
|
||||
login.run();
|
||||
}
|
||||
long end = System.currentTimeMillis() - start;
|
||||
|
|
Loading…
Reference in a new issue