Details
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/ClientAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/ClientAdapter.java
index 08476ef..4360882 100755
@@ -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;
}
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/ScopeMappingEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/ScopeMappingEntity.java
index 8e19898..e1a00f9 100755
@@ -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 {
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserRoleMappingEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserRoleMappingEntity.java
index b5a7a2e..647acea 100755
@@ -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 {
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/UserAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/UserAdapter.java
index 586180e..e86b42f 100755
@@ -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;
}
diff --git a/testsuite/integration/src/main/resources/META-INF/persistence.xml b/testsuite/integration/src/main/resources/META-INF/persistence.xml
index 39dd390..ad9c513 100755
@@ -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>
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/perf/AccessTokenPerfTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/perf/AccessTokenPerfTest.java
index ca22ebd..73db611 100755
@@ -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;