You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/05/16 13:40:08 UTC

[2/2] syncope git commit: [SYNCOPE-1082] using native queries to work with dynamic members' tables

[SYNCOPE-1082] using native queries to work with dynamic members' tables


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/9fc62b66
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/9fc62b66
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/9fc62b66

Branch: refs/heads/master
Commit: 9fc62b668a300567cb3e3d6c468187226e387663
Parents: 66f6651
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue May 16 11:02:38 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue May 16 11:03:04 2017 +0200

----------------------------------------------------------------------
 .../core/persistence/api/dao/AnyObjectDAO.java  |   2 +-
 .../core/persistence/api/dao/GroupDAO.java      |   8 ++
 .../core/persistence/api/dao/RoleDAO.java       |   4 +
 .../core/persistence/api/dao/UserDAO.java       |   6 +-
 .../persistence/api/entity/DynMembership.java   |   4 +-
 .../persistence/jpa/dao/JPAAnyObjectDAO.java    |  22 ++--
 .../core/persistence/jpa/dao/JPAGroupDAO.java   | 101 +++++++++++++++++--
 .../core/persistence/jpa/dao/JPARoleDAO.java    |  42 +++++++-
 .../core/persistence/jpa/dao/JPAUserDAO.java    |  32 +++---
 .../anyobject/JPAADynGroupMembership.java       |   9 +-
 .../jpa/entity/user/AbstractUDynMembership.java |   5 +-
 .../jpa/entity/user/JPADynRoleMembership.java   |   4 +-
 .../jpa/entity/user/JPAUDynGroupMembership.java |   4 +-
 .../core/persistence/jpa/outer/GroupTest.java   |  48 +++++----
 .../core/persistence/jpa/outer/RoleTest.java    |  18 ++--
 .../java/data/AnyObjectDataBinderImpl.java      |   2 +-
 .../java/data/RoleDataBinderImpl.java           |   2 +-
 .../java/data/UserDataBinderImpl.java           |   4 +-
 .../client/ElasticsearchUtils.java              |  11 +-
 pom.xml                                         |   2 +-
 20 files changed, 236 insertions(+), 94 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java
index c3a4cd7..650130c 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java
@@ -43,7 +43,7 @@ public interface AnyObjectDAO extends AnyDAO<AnyObject> {
 
     AnyObject authFindByName(String name);
 
-    List<Group> findDynGroupMemberships(AnyObject anyObject);
+    List<Group> findDynGroups(AnyObject anyObject);
 
     List<ARelationship> findAllARelationships(AnyObject anyObject);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
index c74e430..b08c9b9 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
@@ -46,8 +46,16 @@ public interface GroupDAO extends AnyDAO<Group> {
 
     List<TypeExtension> findTypeExtensions(AnyTypeClass anyTypeClass);
 
+    List<String> findADynMembersKeys(Group group);
+
     void refreshDynMemberships(AnyObject anyObject);
 
+    void removeDynMemberships(AnyObject anyObject);
+
+    List<String> findUDynMembersKeys(Group group);
+
     void refreshDynMemberships(User user);
 
+    void removeDynMemberships(User user);
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
index c5ff0e8..16f3003 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
@@ -39,5 +39,9 @@ public interface RoleDAO extends DAO<Role> {
 
     void delete(String key);
 
+    List<String> findDynMembersKeys(Role role);
+
     void refreshDynMemberships(User user);
+
+    void removeDynMemberships(User user);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UserDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UserDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UserDAO.java
index 55efa93..9e44bb3 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UserDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UserDAO.java
@@ -42,12 +42,12 @@ public interface UserDAO extends AnyDAO<User> {
 
     List<User> findBySecurityQuestion(SecurityQuestion securityQuestion);
 
-    List<Role> findDynRoleMemberships(User user);
-
-    List<Group> findDynGroupMemberships(User user);
+    List<Role> findDynRoles(User user);
 
     Collection<Role> findAllRoles(User user);
 
+    List<Group> findDynGroups(User user);
+
     Collection<Group> findAllGroups(User user);
 
     Collection<String> findAllGroupKeys(User user);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java
index c3bcea9..2b12744 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java
@@ -18,8 +18,6 @@
  */
 package org.apache.syncope.core.persistence.api.entity;
 
-import java.util.List;
-
 public interface DynMembership<A extends Any<?>> extends Entity {
 
     String getFIQLCond();
@@ -28,5 +26,5 @@ public interface DynMembership<A extends Any<?>> extends Entity {
 
     boolean add(A any);
 
-    List<? extends A> getMembers();
+    void clear();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
index a64afe3..23234b3 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import static org.apache.syncope.core.persistence.jpa.dao.AbstractDAO.LOG;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -232,34 +234,32 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
     }
 
     @Override
-    public void delete(final AnyObject any) {
-        for (Group group : findDynGroupMemberships(any)) {
-            group.getADynMembership(any.getType()).getMembers().remove(any);
-        }
+    public void delete(final AnyObject anyObject) {
+        groupDAO().removeDynMemberships(anyObject);
 
-        for (ARelationship relationship : findARelationships(any)) {
+        for (ARelationship relationship : findARelationships(anyObject)) {
             relationship.getLeftEnd().getRelationships().remove(relationship);
             save(relationship.getLeftEnd());
 
             entityManager().remove(relationship);
         }
-        for (URelationship relationship : findURelationships(any)) {
+        for (URelationship relationship : findURelationships(anyObject)) {
             relationship.getLeftEnd().getRelationships().remove(relationship);
             userDAO().save(relationship.getLeftEnd());
 
             entityManager().remove(relationship);
         }
 
-        entityManager().remove(any);
-        publisher.publishEvent(new AnyDeletedEvent(this, AnyTypeKind.ANY_OBJECT, any.getKey()));
+        entityManager().remove(anyObject);
+        publisher.publishEvent(new AnyDeletedEvent(this, AnyTypeKind.ANY_OBJECT, anyObject.getKey()));
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
-    public List<Group> findDynGroupMemberships(final AnyObject anyObject) {
+    public List<Group> findDynGroups(final AnyObject anyObject) {
         Query query = entityManager().createNativeQuery(
                 "SELECT t2.id FROM " + JPAADynGroupMembership.TABLE + " t0 "
-                + "INNER JOIN ADynGroupMembership_AnyObject t1 "
+                + "INNER JOIN " + JPAADynGroupMembership.JOIN_TABLE + " t1 "
                 + "ON t0.id = t1.aDynGroupMembership_id "
                 + "LEFT OUTER JOIN " + JPAGroup.TABLE + " t2 "
                 + "ON t0.GROUP_ID = t2.id "
@@ -293,7 +293,7 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
                         return input.getRightEnd();
                     }
                 }, new ArrayList<Group>()),
-                findDynGroupMemberships(anyObject));
+                findDynGroups(anyObject));
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index 54423b8..93ceddc 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -18,6 +18,9 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import static org.apache.syncope.core.persistence.jpa.dao.AbstractDAO.LOG;
+
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -56,8 +59,10 @@ import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
+import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADynGroupMembership;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAMembership;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPATypeExtension;
+import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDynGroupMembership;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUMembership;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent;
@@ -271,7 +276,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
                     buildDynMembershipCond(merged.getUDynMembership().getFIQLCond(), merged.getRealm()),
                     AnyTypeKind.USER);
 
-            merged.getUDynMembership().getMembers().clear();
+            merged.getUDynMembership().clear();
             for (User user : matching) {
                 merged.getUDynMembership().add(user);
                 publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, user));
@@ -282,7 +287,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
                     buildDynMembershipCond(memb.getFIQLCond(), merged.getRealm()),
                     AnyTypeKind.ANY_OBJECT);
 
-            memb.getMembers().clear();
+            memb.clear();
             for (AnyObject anyObject : matching) {
                 memb.add(anyObject);
                 publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, anyObject));
@@ -337,6 +342,26 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         return query.getResultList();
     }
 
+    @Override
+    public List<String> findADynMembersKeys(final Group group) {
+        List<String> result = new ArrayList<>();
+        for (ADynGroupMembership memb : group.getADynMemberships()) {
+            Query query = entityManager().createNativeQuery(
+                    "SELECT t.anyObject_id FROM " + JPAADynGroupMembership.JOIN_TABLE + " t "
+                    + "WHERE t.aDynGroupMembership_id=?");
+            query.setParameter(1, memb.getKey());
+
+            for (Object key : query.getResultList()) {
+                String actualKey = key instanceof Object[]
+                        ? (String) ((Object[]) key)[0]
+                        : ((String) key);
+
+                result.add(actualKey);
+            }
+        }
+        return result;
+    }
+
     private List<Group> findWithADynMemberships(final int page, final int itemsPerPage) {
         TypedQuery<Group> query = entityManager().createQuery(
                 "SELECT e FROM  " + JPAGroup.class.getSimpleName() + " e WHERE e.aDynMemberships IS NOT EMPTY",
@@ -363,16 +388,56 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
                                 buildDynMembershipCond(memb.getFIQLCond(), group.getRealm()))) {
 
                             memb.add(anyObject);
-                            publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
                         } else {
-                            memb.getMembers().remove(anyObject);
-                            publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
+                            Query query = entityManager().createNativeQuery(
+                                    "DELETE FROM " + JPAADynGroupMembership.JOIN_TABLE + " t "
+                                    + "WHERE t.anyObject_id=? and t.aDynGroupMembership_id=?");
+                            query.setParameter(1, anyObject.getKey());
+                            query.setParameter(2, memb.getKey());
+                            query.executeUpdate();
                         }
+
+                        publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
                     }
                 }
             }
         }
+    }
+
+    @Override
+    public void removeDynMemberships(final AnyObject anyObject) {
+        List<Group> dynGroups = anyObjectDAO().findDynGroups(anyObject);
+
+        Query query = entityManager().createNativeQuery(
+                "DELETE FROM " + JPAADynGroupMembership.JOIN_TABLE + " t WHERE t.anyObject_id=?");
+        query.setParameter(1, anyObject.getKey());
+        query.executeUpdate();
 
+        for (Group group : dynGroups) {
+            publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
+        }
+    }
+
+    @Override
+    public List<String> findUDynMembersKeys(final Group group) {
+        if (group.getUDynMembership() == null) {
+            return Collections.emptyList();
+        }
+
+        Query query = entityManager().createNativeQuery(
+                "SELECT t.user_id FROM " + JPAUDynGroupMembership.JOIN_TABLE + " t "
+                + "WHERE t.uDynGroupMembership_id=?");
+        query.setParameter(1, group.getUDynMembership().getKey());
+
+        List<String> result = new ArrayList<>();
+        for (Object key : query.getResultList()) {
+            String actualKey = key instanceof Object[]
+                    ? (String) ((Object[]) key)[0]
+                    : ((String) key);
+
+            result.add(actualKey);
+        }
+        return result;
     }
 
     private List<Group> findWithUDynMemberships(final int page, final int itemsPerPage) {
@@ -400,13 +465,33 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
                             buildDynMembershipCond(group.getUDynMembership().getFIQLCond(), group.getRealm()))) {
 
                         group.getUDynMembership().add(user);
-                        publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
                     } else {
-                        group.getUDynMembership().getMembers().remove(user);
-                        publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
+                        Query query = entityManager().createNativeQuery(
+                                "DELETE FROM " + JPAUDynGroupMembership.JOIN_TABLE + " t "
+                                + "WHERE t.user_id=? and t.uDynGroupMembership_id=?");
+                        query.setParameter(1, user.getKey());
+                        query.setParameter(2, group.getUDynMembership().getKey());
+                        query.executeUpdate();
                     }
+
+                    publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
                 }
             }
         }
     }
+
+    @Override
+    public void removeDynMemberships(final User user) {
+        List<Group> dynGroups = userDAO().findDynGroups(user);
+
+        Query query = entityManager().createNativeQuery(
+                "DELETE FROM " + JPAUDynGroupMembership.JOIN_TABLE + " t WHERE t.user_id=?");
+        query.setParameter(1, user.getKey());
+        query.executeUpdate();
+
+        for (Group group : dynGroups) {
+            publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
index a5cabbb..7aa9300 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
@@ -29,6 +31,7 @@ import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.JPARole;
+import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent;
@@ -88,7 +91,7 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
             List<User> matchingUsers = searchDAO().search(
                     SearchCondConverter.convert(role.getDynMembership().getFIQLCond()), AnyTypeKind.USER);
 
-            role.getDynMembership().getMembers().clear();
+            role.getDynMembership().clear();
             for (User user : matchingUsers) {
                 role.getDynMembership().add(user);
                 publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, user));
@@ -122,6 +125,28 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
         delete(role);
     }
 
+    @Override
+    public List<String> findDynMembersKeys(final Role role) {
+        if (role.getDynMembership() == null) {
+            return Collections.emptyList();
+        }
+
+        Query query = entityManager().createNativeQuery(
+                "SELECT t.user_id FROM " + JPADynRoleMembership.JOIN_TABLE + " t "
+                + "WHERE t.dynRoleMembership_id=?");
+        query.setParameter(1, role.getDynMembership().getKey());
+
+        List<String> result = new ArrayList<>();
+        for (Object key : query.getResultList()) {
+            String actualKey = key instanceof Object[]
+                    ? (String) ((Object[]) key)[0]
+                    : ((String) key);
+
+            result.add(actualKey);
+        }
+        return result;
+    }
+
     @Transactional
     @Override
     public void refreshDynMemberships(final User user) {
@@ -130,10 +155,23 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
                 if (searchDAO().matches(user, SearchCondConverter.convert(role.getDynMembership().getFIQLCond()))) {
                     role.getDynMembership().add(user);
                 } else {
-                    role.getDynMembership().getMembers().remove(user);
+                    Query query = entityManager().createNativeQuery(
+                            "DELETE FROM " + JPADynRoleMembership.JOIN_TABLE + " t "
+                            + "WHERE t.user_id=? and t.dynRoleMembership_id=?");
+                    query.setParameter(1, user.getKey());
+                    query.setParameter(2, role.getDynMembership().getKey());
+                    query.executeUpdate();
                 }
             }
         }
     }
 
+    @Override
+    public void removeDynMemberships(final User user) {
+        Query query = entityManager().createNativeQuery(
+                "DELETE FROM " + JPADynRoleMembership.JOIN_TABLE + " t WHERE t.user_id=?");
+        query.setParameter(1, user.getKey());
+        query.executeUpdate();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
index a6b4383..92b94fb 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import static org.apache.syncope.core.persistence.jpa.dao.AbstractDAO.LOG;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -452,12 +454,8 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
 
     @Override
     public void delete(final User user) {
-        for (Role role : findDynRoleMemberships(user)) {
-            role.getDynMembership().getMembers().remove(user);
-        }
-        for (Group group : findDynGroupMemberships(user)) {
-            group.getUDynMembership().getMembers().remove(user);
-        }
+        roleDAO.removeDynMemberships(user);
+        groupDAO.removeDynMemberships(user);
 
         AccessToken accessToken = accessTokenDAO.findByOwner(user.getUsername());
         if (accessToken != null) {
@@ -470,10 +468,16 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
-    public List<Role> findDynRoleMemberships(final User user) {
+    public Collection<Role> findAllRoles(final User user) {
+        return CollectionUtils.union(user.getRoles(), findDynRoles(user));
+    }
+
+    @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
+    @Override
+    public List<Role> findDynRoles(final User user) {
         Query query = entityManager().createNativeQuery(
                 "SELECT t2.id FROM " + JPADynRoleMembership.TABLE + " t0 "
-                + "INNER JOIN " + JPADynRoleMembership.TABLE + "_User t1 "
+                + "INNER JOIN " + JPADynRoleMembership.JOIN_TABLE + " t1 "
                 + "ON t0.id = t1.dynRoleMembership_id "
                 + "LEFT OUTER JOIN " + JPARole.TABLE + " t2 "
                 + "ON t0.ROLE_ID = t2.id "
@@ -498,10 +502,10 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
-    public List<Group> findDynGroupMemberships(final User user) {
+    public List<Group> findDynGroups(final User user) {
         Query query = entityManager().createNativeQuery(
                 "SELECT t2.id FROM " + JPAUDynGroupMembership.TABLE + " t0 "
-                + "INNER JOIN " + JPAUDynGroupMembership.TABLE + "_User t1 "
+                + "INNER JOIN " + JPAUDynGroupMembership.JOIN_TABLE + " t1 "
                 + "ON t0.id = t1.uDynGroupMembership_id "
                 + "LEFT OUTER JOIN " + JPAGroup.TABLE + " t2 "
                 + "ON t0.GROUP_ID = t2.id "
@@ -526,12 +530,6 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
-    public Collection<Role> findAllRoles(final User user) {
-        return CollectionUtils.union(user.getRoles(), findDynRoleMemberships(user));
-    }
-
-    @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
-    @Override
     public Collection<Group> findAllGroups(final User user) {
         return CollectionUtils.union(
                 CollectionUtils.collect(user.getMemberships(), new Transformer<UMembership, Group>() {
@@ -541,7 +539,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
                         return input.getRightEnd();
                     }
                 }, new ArrayList<Group>()),
-                findDynGroupMemberships(user));
+                findDynGroups(user));
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java
index 4bb75fc..5ae02d3 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java
@@ -43,6 +43,8 @@ public class JPAADynGroupMembership extends AbstractDynMembership<AnyObject> imp
 
     public static final String TABLE = "ADynGroupMembership";
 
+    public static final String JOIN_TABLE = TABLE + "_AnyObject";
+
     @OneToOne
     private JPAGroup group;
 
@@ -50,7 +52,7 @@ public class JPAADynGroupMembership extends AbstractDynMembership<AnyObject> imp
     private JPAAnyType anyType;
 
     @ManyToMany
-    @JoinTable(joinColumns =
+    @JoinTable(name = JOIN_TABLE, joinColumns =
             @JoinColumn(name = "aDynGroupMembership_id"),
             inverseJoinColumns =
             @JoinColumn(name = "anyObject_id"))
@@ -85,7 +87,8 @@ public class JPAADynGroupMembership extends AbstractDynMembership<AnyObject> imp
     }
 
     @Override
-    public List<? extends AnyObject> getMembers() {
-        return anyObjects;
+    public void clear() {
+        anyObjects.clear();
     }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java
index d4fe264..963b742 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java
@@ -37,7 +37,8 @@ public abstract class AbstractUDynMembership extends AbstractDynMembership<User>
     }
 
     @Override
-    public List<? extends User> getMembers() {
-        return internalGetUsers();
+    public void clear() {
+        internalGetUsers().clear();
     }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java
index dbb2fab..aa310cd 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java
@@ -38,11 +38,13 @@ public class JPADynRoleMembership extends AbstractUDynMembership implements DynR
 
     public static final String TABLE = "DynRoleMembership";
 
+    public static final String JOIN_TABLE = TABLE + "_User";
+
     @OneToOne
     private JPARole role;
 
     @ManyToMany
-    @JoinTable(name = TABLE + "_User", joinColumns =
+    @JoinTable(name = JOIN_TABLE, joinColumns =
             @JoinColumn(name = "dynRoleMembership_id"),
             inverseJoinColumns =
             @JoinColumn(name = "user_id"))

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java
index 53db0d9..63228b3 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java
@@ -38,11 +38,13 @@ public class JPAUDynGroupMembership extends AbstractUDynMembership implements UD
 
     public static final String TABLE = "UDynGroupMembership";
 
+    public static final String JOIN_TABLE = TABLE + "_User";
+
     @OneToOne
     private JPAGroup group;
 
     @ManyToMany
-    @JoinTable(name = TABLE + "_User", joinColumns =
+    @JoinTable(name = JOIN_TABLE, joinColumns =
             @JoinColumn(name = "uDynGroupMembership_id"),
             inverseJoinColumns =
             @JoinColumn(name = "user_id"))

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
index 39eb25e..ff050bf 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
@@ -24,15 +24,16 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
@@ -228,11 +229,10 @@ public class GroupTest extends AbstractTest {
         assertEquals(actual, actual.getUDynMembership().getGroup());
 
         // 3. verify that expected users have the created group dynamically assigned
-        assertEquals(2, actual.getUDynMembership().getMembers().size());
+        List<String> members = groupDAO.findUDynMembersKeys(actual);
+        assertEquals(2, members.size());
         assertEquals(new HashSet<>(Arrays.asList("c9b2dec2-00a7-4855-97c0-d854842b4b24", newUserKey)),
-                CollectionUtils.collect(actual.getUDynMembership().getMembers(),
-                        EntityUtils.<User>keyTransformer(),
-                        new HashSet<String>()));
+                new HashSet<>(members));
 
         user = userDAO.findByUsername("bellini");
         assertNotNull(user);
@@ -246,10 +246,9 @@ public class GroupTest extends AbstractTest {
         userDAO.flush();
 
         actual = groupDAO.find(actual.getKey());
-        assertEquals(1, actual.getUDynMembership().getMembers().size());
-        assertEquals(
-                "c9b2dec2-00a7-4855-97c0-d854842b4b24",
-                actual.getUDynMembership().getMembers().get(0).getKey());
+        members = groupDAO.findUDynMembersKeys(actual);
+        assertEquals(1, members.size());
+        assertEquals("c9b2dec2-00a7-4855-97c0-d854842b4b24", members.get(0));
 
         // 5. delete group and verify that dynamic membership was also removed
         String dynMembershipKey = actual.getUDynMembership().getKey();
@@ -321,12 +320,18 @@ public class GroupTest extends AbstractTest {
         assertEquals(actual, actual.getADynMembership(anyTypeDAO.find("PRINTER")).getGroup());
 
         // 3. verify that expected any objects have the created group dynamically assigned
-        assertEquals(2, actual.getADynMembership(anyTypeDAO.find("PRINTER")).getMembers().size());
-        assertEquals(new HashSet<>(Arrays.asList(
-                "fc6dbc3a-6c07-4965-8781-921e7401a4a5", newAnyObjectKey)),
-                CollectionUtils.collect(actual.getADynMembership(anyTypeDAO.find("PRINTER")).getMembers(),
-                        EntityUtils.<AnyObject>keyTransformer(),
-                        new HashSet<String>()));
+        System.out.println("MMMMMMMMM " + groupDAO.findADynMembersKeys(actual));
+        List<String> members = CollectionUtils.select(groupDAO.findADynMembersKeys(actual), new Predicate<String>() {
+
+            @Override
+            public boolean evaluate(final String object) {
+                return "PRINTER".equals(anyObjectDAO.find(object).getType().getKey());
+            }
+        }, new ArrayList<String>());
+        assertEquals(2, members.size());
+        assertEquals(
+                new HashSet<>(Arrays.asList("fc6dbc3a-6c07-4965-8781-921e7401a4a5", newAnyObjectKey)),
+                new HashSet<>(members));
 
         anyObject = anyObjectDAO.find("fc6dbc3a-6c07-4965-8781-921e7401a4a5");
         assertNotNull(anyObject);
@@ -340,10 +345,15 @@ public class GroupTest extends AbstractTest {
         anyObjectDAO.flush();
 
         actual = groupDAO.find(actual.getKey());
-        assertEquals(1, actual.getADynMembership(anyTypeDAO.find("PRINTER")).getMembers().size());
-        assertEquals(
-                "fc6dbc3a-6c07-4965-8781-921e7401a4a5",
-                actual.getADynMembership(anyTypeDAO.find("PRINTER")).getMembers().get(0).getKey());
+        members = CollectionUtils.select(groupDAO.findADynMembersKeys(actual), new Predicate<String>() {
+
+            @Override
+            public boolean evaluate(final String object) {
+                return "PRINTER".equals(anyObjectDAO.find(object).getType().getKey());
+            }
+        }, new ArrayList<String>());
+        assertEquals(1, members.size());
+        assertEquals("fc6dbc3a-6c07-4965-8781-921e7401a4a5", members.get(0));
 
         // 5. delete group and verify that dynamic membership was also removed
         String dynMembershipKey = actual.getADynMembership(anyTypeDAO.find("PRINTER")).getKey();

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
index 04d3e39..49d92c7 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
@@ -26,11 +26,10 @@ import static org.junit.Assert.assertTrue;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
@@ -123,11 +122,11 @@ public class RoleTest extends AbstractTest {
         assertEquals(actual, actual.getDynMembership().getRole());
 
         // 3. verify that expected users have the created role dynamically assigned
-        assertEquals(2, actual.getDynMembership().getMembers().size());
-        assertEquals(new HashSet<>(Arrays.asList("c9b2dec2-00a7-4855-97c0-d854842b4b24", newUserKey)),
-                CollectionUtils.collect(actual.getDynMembership().getMembers(),
-                        EntityUtils.<User>keyTransformer(),
-                        new HashSet<String>()));
+        List<String> members = roleDAO.findDynMembersKeys(actual);
+        assertEquals(2, members.size());
+        assertEquals(
+                new HashSet<>(Arrays.asList("c9b2dec2-00a7-4855-97c0-d854842b4b24", newUserKey)),
+                new HashSet<>(members));
 
         user = userDAO.find("c9b2dec2-00a7-4855-97c0-d854842b4b24");
         assertNotNull(user);
@@ -141,8 +140,9 @@ public class RoleTest extends AbstractTest {
         userDAO.flush();
 
         actual = roleDAO.find(actual.getKey());
-        assertEquals(1, actual.getDynMembership().getMembers().size());
-        assertEquals("c9b2dec2-00a7-4855-97c0-d854842b4b24", actual.getDynMembership().getMembers().get(0).getKey());
+        members = roleDAO.findDynMembersKeys(actual);
+        assertEquals(1, members.size());
+        assertEquals("c9b2dec2-00a7-4855-97c0-d854842b4b24", members.get(0));
 
         // 5. delete role and verify that dynamic membership was also removed
         String dynMembershipKey = actual.getDynMembership().getKey();

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index 677bf81..fa17f20 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -125,7 +125,7 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
             }, anyObjectTO.getMemberships());
 
             // dynamic memberships
-            CollectionUtils.collect(anyObjectDAO.findDynGroupMemberships(anyObject),
+            CollectionUtils.collect(anyObjectDAO.findDynGroups(anyObject),
                     EntityUtils.<Group>keyTransformer(), anyObjectTO.getDynGroups());
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
index 7db064d..567739d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
@@ -100,7 +100,7 @@ public class RoleDataBinderImpl implements RoleDataBinder {
         } else if (role.getDynMembership() != null && roleTO.getDynMembershipCond() != null
                 && !role.getDynMembership().getFIQLCond().equals(roleTO.getDynMembershipCond())) {
 
-            role.getDynMembership().getMembers().clear();
+            role.getDynMembership().clear();
             setDynMembership(role, roleTO.getDynMembershipCond());
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index fe21b51..2ba5d85 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -613,9 +613,9 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
             }, userTO.getMemberships());
 
             // dynamic memberships
-            CollectionUtils.collect(userDAO.findDynRoleMemberships(user),
+            CollectionUtils.collect(userDAO.findDynRoles(user),
                     EntityUtils.<Role>keyTransformer(), userTO.getDynRoles());
-            CollectionUtils.collect(userDAO.findDynGroupMemberships(user),
+            CollectionUtils.collect(userDAO.findDynGroups(user),
                     EntityUtils.<Group>keyTransformer(), userTO.getDynGroups());
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
index 572ef37..1d22a1e 100644
--- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
@@ -32,12 +32,10 @@ import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.Role;
-import org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.URelationship;
 import org.apache.syncope.core.persistence.api.entity.user.User;
@@ -130,10 +128,7 @@ public class ElasticsearchUtils {
                     return input.getLeftEnd().getKey();
                 }
             }, new ArrayList<>());
-            UDynGroupMembership udynmembership = group.getUDynMembership();
-            if (udynmembership != null) {
-                CollectionUtils.collect(udynmembership.getMembers(), EntityUtils.keyTransformer(), members);
-            }
+            members.add(groupDAO.findUDynMembersKeys(group));
             CollectionUtils.collect(groupDAO.findAMemberships(group),
                     new Transformer<AMembership, Object>() {
 
@@ -142,9 +137,7 @@ public class ElasticsearchUtils {
                     return input.getLeftEnd().getKey();
                 }
             }, members);
-            for (ADynGroupMembership adynmembership : group.getADynMemberships()) {
-                CollectionUtils.collect(adynmembership.getMembers(), EntityUtils.keyTransformer(), members);
-            }
+            members.add(groupDAO.findADynMembersKeys(group));
             builder = builder.field("members", members);
         } else if (any instanceof User) {
             User user = ((User) any);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9fc62b66/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 39b3fbb..70a26e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1578,7 +1578,7 @@ under the License.
       <dependency>
         <groupId>com.icegreen</groupId>
         <artifactId>greenmail</artifactId>
-        <version>1.5.4</version>
+        <version>1.5.5</version>
         <scope>test</scope>
       </dependency>
       <dependency>