From 3edce7f58010f4c999fe0e4bc56ed113bed51361 Mon Sep 17 00:00:00 2001 From: Bill Burke Date: Thu, 17 Jul 2014 15:20:56 -0400 Subject: [PATCH] named queries and roleId in RoleMapping --- .../models/jpa/ApplicationAdapter.java | 2 +- .../keycloak/models/jpa/JpaUserProvider.java | 13 +++--- .../org/keycloak/models/jpa/RealmAdapter.java | 6 +-- .../org/keycloak/models/jpa/UserAdapter.java | 7 +--- .../jpa/entities/ScopeMappingEntity.java | 4 +- .../models/jpa/entities/SocialLinkEntity.java | 3 +- .../models/jpa/entities/UserEntity.java | 3 ++ .../jpa/entities/UserRoleMappingEntity.java | 40 +++++++++---------- 8 files changed, 40 insertions(+), 38 deletions(-) diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/ApplicationAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/ApplicationAdapter.java index caf8f4e8aa..6da99dfe9c 100755 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/ApplicationAdapter.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/ApplicationAdapter.java @@ -146,7 +146,7 @@ public class ApplicationAdapter extends ClientAdapter implements ApplicationMode applicationEntity.getRoles().remove(role); applicationEntity.getDefaultRoles().remove(role); em.createNativeQuery("delete from CompositeRole where childRole = :role").setParameter("role", role).executeUpdate(); - em.createQuery("delete from " + ScopeMappingEntity.class.getSimpleName() + " where role = :role").setParameter("role", role).executeUpdate(); + em.createNamedQuery("deleteScopeMappingByRole").setParameter("role", role).executeUpdate(); role.setApplication(null); em.flush(); em.remove(role); diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaUserProvider.java b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaUserProvider.java index d75114ccc2..24c31c3d3c 100755 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaUserProvider.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaUserProvider.java @@ -88,8 +88,8 @@ public class JpaUserProvider implements UserProvider { } private void removeUser(UserEntity user) { - em.createQuery("delete from " + UserRoleMappingEntity.class.getSimpleName() + " where user = :user").setParameter("user", user).executeUpdate(); - em.createQuery("delete from " + SocialLinkEntity.class.getSimpleName() + " where user = :user").setParameter("user", user).executeUpdate(); + em.createNamedQuery("deleteUserRoleMappingsByUser").setParameter("user", user).executeUpdate(); + em.createNamedQuery("deleteSocialLinkByUser").setParameter("user", user).executeUpdate(); if (user.getAuthenticationLink() != null) { for (AuthenticationLinkEntity l : user.getAuthenticationLink()) { em.remove(l); @@ -145,8 +145,7 @@ public class JpaUserProvider implements UserProvider { @Override public void preRemove(RoleModel role) { - RoleEntity roleEntity = em.getReference(RoleEntity.class, role.getId()); - em.createQuery("delete from " + UserRoleMappingEntity.class.getSimpleName() + " where role = :role").setParameter("role", roleEntity).executeUpdate(); + em.createNamedQuery("deleteUserRoleMappingsByRole").setParameter("roleId", role.getId()).executeUpdate(); } @Override @@ -214,7 +213,7 @@ public class JpaUserProvider implements UserProvider { RealmEntity realmEntity = em.getReference(RealmEntity.class, realm.getId()); // TODO: named query? - Object count = em.createQuery("select count(u) from UserEntity u where u.realm = :realm") + Object count = em.createNamedQuery("getRealmUserCount") .setParameter("realm", realmEntity) .getSingleResult(); return ((Number)count).intValue(); @@ -222,7 +221,7 @@ public class JpaUserProvider implements UserProvider { @Override public List getUsers(RealmModel realm, int firstResult, int maxResults) { - TypedQuery query = em.createQuery("select u from UserEntity u where u.realm = :realm order by u.username", UserEntity.class); + TypedQuery query = em.createNamedQuery("getAllUsersByRealm", UserEntity.class); RealmEntity realmEntity = em.getReference(RealmEntity.class, realm.getId()); query.setParameter("realm", realmEntity); if (firstResult != -1) { @@ -244,7 +243,7 @@ public class JpaUserProvider implements UserProvider { @Override public List searchForUser(String search, RealmModel realm, int firstResult, int maxResults) { - TypedQuery query = em.createQuery("select u from UserEntity u where u.realm = :realm and ( lower(u.username) like :search or lower(concat(u.firstName, ' ', u.lastName)) like :search or u.email like :search ) order by u.username", UserEntity.class); + TypedQuery query = em.createNamedQuery("searchForUser", UserEntity.class); RealmEntity realmEntity = em.getReference(RealmEntity.class, realm.getId()); query.setParameter("realm", realmEntity); query.setParameter("search", "%" + search.toLowerCase() + "%"); diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java index 7b30af57de..f3e95f8a33 100755 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java @@ -548,7 +548,7 @@ public class RealmAdapter implements RealmModel { return false; } em.remove(applicationEntity); - em.createQuery("delete from " + ScopeMappingEntity.class.getSimpleName() + " where client = :client").setParameter("client", applicationEntity).executeUpdate(); + em.createNamedQuery("deleteScopeMappingByClient").setParameter("client", applicationEntity).executeUpdate(); em.flush(); return true; @@ -608,7 +608,7 @@ public class RealmAdapter implements RealmModel { OAuthClientModel oauth = getOAuthClientById(id); if (oauth == null) return false; OAuthClientEntity client = em.getReference(OAuthClientEntity.class, oauth.getId()); - em.createQuery("delete from " + ScopeMappingEntity.class.getSimpleName() + " where client = :client").setParameter("client", client).executeUpdate(); + em.createNamedQuery("deleteScopeMappingByClient").setParameter("client", client).executeUpdate(); em.remove(client); return true; } @@ -770,7 +770,7 @@ public class RealmAdapter implements RealmModel { realm.getDefaultRoles().remove(role); em.createNativeQuery("delete from CompositeRole where childRole = :role").setParameter("role", roleEntity).executeUpdate(); - em.createQuery("delete from " + ScopeMappingEntity.class.getSimpleName() + " where role = :role").setParameter("role", roleEntity).executeUpdate(); + em.createNamedQuery("deleteScopeMappingByRole").setParameter("role", roleEntity).executeUpdate(); em.remove(roleEntity); 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 13ec5dab7a..18304af3e0 100755 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/UserAdapter.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/UserAdapter.java @@ -11,7 +11,6 @@ import org.keycloak.models.UserCredentialValueModel; import org.keycloak.models.UserModel; import org.keycloak.models.jpa.entities.AuthenticationLinkEntity; import org.keycloak.models.jpa.entities.CredentialEntity; -import org.keycloak.models.jpa.entities.RoleEntity; import org.keycloak.models.jpa.entities.UserAttributeEntity; import org.keycloak.models.jpa.entities.UserEntity; import org.keycloak.models.jpa.entities.UserRequiredActionEntity; @@ -305,8 +304,7 @@ public class UserAdapter implements UserModel { protected TypedQuery getUserRoleMappingEntityTypedQuery(RoleModel role) { TypedQuery query = em.createNamedQuery("userHasRole", UserRoleMappingEntity.class); query.setParameter("user", getUser()); - RoleEntity roleEntity = em.getReference(RoleEntity.class, role.getId()); - query.setParameter("role", roleEntity); + query.setParameter("roleId", role.getId()); return query; } @@ -315,8 +313,7 @@ public class UserAdapter implements UserModel { if (hasRole(role)) return; UserRoleMappingEntity entity = new UserRoleMappingEntity(); entity.setUser(getUser()); - RoleEntity roleEntity = em.getReference(RoleEntity.class, role.getId()); - entity.setRole(roleEntity); + entity.setRoleId(role.getId()); em.persist(entity); em.flush(); em.detach(entity); 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 1cd4c51ca4..2360b2099a 100755 --- 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 @@ -17,7 +17,9 @@ import java.io.Serializable; @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="clientScopeMappingIds", query="select m.role.id from ScopeMappingEntity m where m.client = :client") + @NamedQuery(name="clientScopeMappingIds", query="select m.role.id from ScopeMappingEntity m where m.client = :client"), + @NamedQuery(name="deleteScopeMappingByRole", query="delete from ScopeMappingEntity where role = :role"), + @NamedQuery(name="deleteScopeMappingByClient", query="delete from ScopeMappingEntity where client = :client") }) @Entity @IdClass(ScopeMappingEntity.Key.class) diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/SocialLinkEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/SocialLinkEntity.java index 4ec5f28a19..01af791998 100755 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/SocialLinkEntity.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/SocialLinkEntity.java @@ -17,7 +17,8 @@ import java.io.Serializable; @NamedQuery(name="findSocialLinkByUser", query="select link from SocialLinkEntity link where link.user = :user"), @NamedQuery(name="findSocialLinkByUserAndProvider", query="select link from SocialLinkEntity link where link.user = :user and link.socialProvider = :socialProvider"), @NamedQuery(name="findUserByLinkAndRealm", query="select link.user from SocialLinkEntity link where link.realm = :realm and link.socialProvider = :socialProvider and link.socialUserId = :socialUserId"), - @NamedQuery(name="deleteSocialLinkByRealm", query="delete from SocialLinkEntity social where social.user IN (select u from UserEntity u where realm=:realm)") + @NamedQuery(name="deleteSocialLinkByRealm", query="delete from SocialLinkEntity social where social.user IN (select u from UserEntity u where realm=:realm)"), + @NamedQuery(name="deleteSocialLinkByUser", query="delete from SocialLinkEntity social where social.user = :user") }) @Entity @IdClass(SocialLinkEntity.Key.class) diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java index c2439207a7..85c8fc7d00 100755 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java @@ -31,11 +31,14 @@ import java.util.Set; * @version $Revision: 1 $ */ @NamedQueries({ + @NamedQuery(name="getAllUsersByRealm", query="select u from UserEntity u where u.realm = :realm order by u.username"), + @NamedQuery(name="searchForUser", query="select u from UserEntity u where u.realm = :realm and ( lower(u.username) like :search or lower(concat(u.firstName, ' ', u.lastName)) like :search or u.email like :search ) order by u.username"), @NamedQuery(name="getRealmUserById", query="select u from UserEntity u where u.id = :id and u.realm = :realm"), @NamedQuery(name="getRealmUserByUsername", query="select u from UserEntity u where u.username = :username and u.realm = :realm"), @NamedQuery(name="getRealmUserByEmail", query="select u from UserEntity u where u.email = :email and u.realm = :realm"), @NamedQuery(name="getRealmUserByLastName", query="select u from UserEntity u where u.lastName = :lastName and u.realm = :realm"), @NamedQuery(name="getRealmUserByFirstLastName", query="select u from UserEntity u where u.firstName = :first and u.lastName = :last and u.realm = :realm"), + @NamedQuery(name="getRealmUserCount", query="select count(u) from UserEntity u where u.realm = :realm"), @NamedQuery(name="deleteUsersByRealm", query="delete from UserEntity u where u.realm = :realm") }) @Entity 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 92f8a0e6e7..3788ef5cf3 100755 --- 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 @@ -15,10 +15,12 @@ import java.io.Serializable; * @version $Revision: 1 $ */ @NamedQueries({ - @NamedQuery(name="userHasRole", query="select m from UserRoleMappingEntity m where m.user = :user and m.role = :role"), + @NamedQuery(name="userHasRole", query="select m from UserRoleMappingEntity m where m.user = :user and m.roleId = :roleId"), @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"), - @NamedQuery(name="deleteUserRoleMappingsByRealm", query="delete from UserRoleMappingEntity mapping where mapping.user IN (select u from UserEntity u where realm=:realm)") + @NamedQuery(name="userRoleMappingIds", query="select m.roleId from UserRoleMappingEntity m where m.user = :user"), + @NamedQuery(name="deleteUserRoleMappingsByRealm", query="delete from UserRoleMappingEntity mapping where mapping.user IN (select u from UserEntity u where realm=:realm)"), + @NamedQuery(name="deleteUserRoleMappingsByRole", query="delete from UserRoleMappingEntity m where m.roleId = :roleId"), + @NamedQuery(name="deleteUserRoleMappingsByUser", query="delete from UserRoleMappingEntity m where m.user = :user") }) @Entity @@ -31,9 +33,7 @@ public class UserRoleMappingEntity { protected UserEntity user; @Id - @ManyToOne(fetch= FetchType.LAZY) - @JoinColumn(name="roleId") - protected RoleEntity role; + protected String roleId; public UserEntity getUser() { return user; @@ -43,34 +43,35 @@ public class UserRoleMappingEntity { this.user = user; } - public RoleEntity getRole() { - return role; + public String getRoleId() { + return roleId; } - public void setRole(RoleEntity role) { - this.role = role; + public void setRoleId(String roleId) { + this.roleId = roleId; } + public static class Key implements Serializable { protected UserEntity user; - protected RoleEntity role; + protected String roleId; public Key() { } - public Key(UserEntity user, RoleEntity role) { + public Key(UserEntity user, String roleId) { this.user = user; - this.role = role; + this.roleId = roleId; } public UserEntity getUser() { return user; } - public RoleEntity getRole() { - return role; + public String getRoleId() { + return roleId; } @Override @@ -80,18 +81,17 @@ public class UserRoleMappingEntity { Key key = (Key) o; - if (role != null ? !role.getId().equals(key.role != null ? key.role.getId() : null) : key.role != null) return false; - if (user != null ? !user.getId().equals(key.user != null ? key.user.getId() : null) : key.user != null) return false; + if (!roleId.equals(key.roleId)) return false; + if (!user.equals(key.user)) return false; return true; } @Override public int hashCode() { - int result = user != null ? user.getId().hashCode() : 0; - result = 31 * result + (role != null ? role.getId().hashCode() : 0); + int result = user.hashCode(); + result = 31 * result + roleId.hashCode(); return result; } } - }