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 2016/04/19 15:02:01 UTC

[14/24] syncope git commit: [SYNCOPE-822] UUID keys

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportTemplateDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportTemplateDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportTemplateDAO.java
index 08b434b..fbecc7e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportTemplateDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportTemplateDAO.java
@@ -26,7 +26,7 @@ import org.apache.syncope.core.persistence.jpa.entity.JPAReportTemplate;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public class JPAReportTemplateDAO extends AbstractDAO<ReportTemplate, String> implements ReportTemplateDAO {
+public class JPAReportTemplateDAO extends AbstractDAO<ReportTemplate> implements ReportTemplateDAO {
 
     @Override
     public ReportTemplate find(final String key) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/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 e8b4816..fc91712 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
@@ -35,7 +35,7 @@ import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
 @Repository
-public class JPARoleDAO extends AbstractDAO<Role, String> implements RoleDAO {
+public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
 
     @Autowired
     private AnySearchDAO searchDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASecurityQuestionDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASecurityQuestionDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASecurityQuestionDAO.java
index 7028080..c9b18ec 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASecurityQuestionDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPASecurityQuestionDAO.java
@@ -29,13 +29,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public class JPASecurityQuestionDAO extends AbstractDAO<SecurityQuestion, Long> implements SecurityQuestionDAO {
+public class JPASecurityQuestionDAO extends AbstractDAO<SecurityQuestion> implements SecurityQuestionDAO {
 
     @Autowired
     private UserDAO userDAO;
 
     @Override
-    public SecurityQuestion find(final Long key) {
+    public SecurityQuestion find(final String key) {
         return entityManager().find(JPASecurityQuestion.class, key);
     }
 
@@ -52,7 +52,7 @@ public class JPASecurityQuestionDAO extends AbstractDAO<SecurityQuestion, Long>
     }
 
     @Override
-    public void delete(final Long key) {
+    public void delete(final String key) {
         SecurityQuestion securityQuestion = find(key);
         if (securityQuestion == null) {
             return;

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
index 95c0c57..414a171 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
@@ -42,7 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ReflectionUtils;
 
 @Repository
-public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
+public class JPATaskDAO extends AbstractDAO<Task> implements TaskDAO {
 
     @Override
     public Class<? extends Task> getEntityReference(final TaskType type) {
@@ -78,7 +78,7 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
     @Transactional(readOnly = true)
     @SuppressWarnings("unchecked")
     @Override
-    public <T extends Task> T find(final Long key) {
+    public <T extends Task> T find(final String key) {
         return (T) entityManager().find(AbstractTask.class, key);
     }
 
@@ -87,9 +87,9 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
                 append(getEntityReference(type).getSimpleName()).
                 append(" t WHERE ");
         if (type == TaskType.SCHEDULED) {
-            builder.append("t.id NOT IN (SELECT t.id FROM ").append(JPAPushTask.class.getSimpleName()).append(" t) ").
+            builder.append("t.key NOT IN (SELECT t.key FROM ").append(JPAPushTask.class.getSimpleName()).append(" t) ").
                     append("AND ").
-                    append("t.id NOT IN (SELECT t.id FROM ").append(JPAPullTask.class.getSimpleName()).append(" t)");
+                    append("t.key NOT IN (SELECT t.key FROM ").append(JPAPullTask.class.getSimpleName()).append(" t)");
         } else {
             builder.append("1=1");
         }
@@ -107,7 +107,7 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
         } else {
             queryString.append("t.executions IS EMPTY ");
         }
-        queryString.append("ORDER BY t.id DESC");
+        queryString.append("ORDER BY t.key DESC");
 
         Query query = entityManager().createQuery(queryString.toString());
         return query.getResultList();
@@ -124,7 +124,7 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
             final ExternalResource resource,
             final Notification notification,
             final AnyTypeKind anyTypeKind,
-            final Long anyKey) {
+            final String anyKey) {
 
         if (resource != null
                 && type != TaskType.PROPAGATION && type != TaskType.PUSH && type != TaskType.PULL) {
@@ -136,6 +136,10 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
             throw new IllegalArgumentException(type + " is not related to users, groups or any objects");
         }
 
+        if (notification != null && type != TaskType.NOTIFICATION) {
+            throw new IllegalArgumentException(type + " is not related to notifications");
+        }
+
         StringBuilder queryString = buildFindAllQuery(type);
 
         if (resource != null) {
@@ -164,7 +168,7 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
         }
 
         if (statement.length() == 0) {
-            statement.append("ORDER BY t.id DESC");
+            statement.append("ORDER BY t.key DESC");
         } else {
             statement.insert(0, "ORDER BY ");
         }
@@ -178,7 +182,7 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
             final ExternalResource resource,
             final Notification notification,
             final AnyTypeKind anyTypeKind,
-            final Long anyKey,
+            final String anyKey,
             final int page,
             final int itemsPerPage,
             final List<OrderByClause> orderByClauses) {
@@ -215,7 +219,7 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
             final ExternalResource resource,
             final Notification notification,
             final AnyTypeKind anyTypeKind,
-            final Long anyKey) {
+            final String anyKey) {
 
         StringBuilder queryString = buildFindAllQuery(type, resource, notification, anyTypeKind, anyKey);
 
@@ -242,7 +246,7 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
     }
 
     @Override
-    public void delete(final Long id) {
+    public void delete(final String id) {
         Task task = find(id);
         if (task == null) {
             return;

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
index c0fcacb..e4c97a6 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
@@ -34,13 +34,13 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ReflectionUtils;
 
 @Repository
-public class JPATaskExecDAO extends AbstractDAO<TaskExec, Long> implements TaskExecDAO {
+public class JPATaskExecDAO extends AbstractDAO<TaskExec> implements TaskExecDAO {
 
     @Autowired
     private TaskDAO taskDAO;
 
     @Override
-    public TaskExec find(final Long key) {
+    public TaskExec find(final String key) {
         return entityManager().find(JPATaskExec.class, key);
     }
 
@@ -117,9 +117,9 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec, Long> implements TaskE
     }
 
     @Override
-    public int count(final Long taskKey) {
+    public int count(final String taskKey) {
         Query countQuery = entityManager().createNativeQuery(
-                "SELECT COUNT(e.id) FROM " + JPATaskExec.TABLE + " e WHERE e.task_id=?1");
+                "SELECT COUNT(e.key) FROM " + JPATaskExec.TABLE + " e WHERE e.task_key=?1");
         countQuery.setParameter(1, taskKey);
 
         return ((Number) countQuery.getSingleResult()).intValue();
@@ -136,7 +136,7 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec, Long> implements TaskE
         }
 
         if (statement.length() == 0) {
-            statement.append("ORDER BY e.id DESC");
+            statement.append("ORDER BY e.key DESC");
         } else {
             statement.insert(0, "ORDER BY ");
         }
@@ -171,15 +171,15 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec, Long> implements TaskE
 
     @Override
     @Transactional(rollbackFor = { Throwable.class })
-    public void saveAndAdd(final Long taskId, final TaskExec execution) {
-        Task task = taskDAO.find(taskId);
+    public void saveAndAdd(final String taskKey, final TaskExec execution) {
+        Task task = taskDAO.find(taskKey);
         task.add(execution);
         taskDAO.save(task);
     }
 
     @Override
-    public void delete(final Long id) {
-        TaskExec execution = find(id);
+    public void delete(final String key) {
+        TaskExec execution = find(key);
         if (execution == null) {
             return;
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/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 62d179f..5c3b241 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
@@ -69,6 +69,7 @@ import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDynGroupMembership;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
+import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.stereotype.Repository;
@@ -161,12 +162,12 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
 
     @Transactional(readOnly = true)
     @Override
-    public User authFind(final String username) {
+    public User authFindByUsername(final String username) {
         if (username == null) {
             throw new NotFoundException("Null username");
         }
 
-        User user = find(username);
+        User user = findByUsername(username);
         if (user == null) {
             throw new NotFoundException("User " + username);
         }
@@ -177,7 +178,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
     }
 
     @Override
-    public User find(final String username) {
+    public User findByUsername(final String username) {
         TypedQuery<User> query = entityManager().createQuery("SELECT e FROM " + JPAUser.class.getSimpleName()
                 + " e WHERE e.username = :username", User.class);
         query.setParameter("username", username);
@@ -458,14 +459,8 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
-    public Collection<Long> findAllGroupKeys(final User user) {
-        return CollectionUtils.collect(findAllGroups(user), new Transformer<Group, Long>() {
-
-            @Override
-            public Long transform(final Group input) {
-                return input.getKey();
-            }
-        });
+    public Collection<String> findAllGroupKeys(final User user) {
+        return CollectionUtils.collect(findAllGroups(user), EntityUtils.<Group>keyTransformer());
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
index b9ebeac..2643861 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
@@ -35,7 +35,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, String> implements VirSchemaDAO {
+public class JPAVirSchemaDAO extends AbstractDAO<VirSchema> implements VirSchemaDAO {
 
     @Autowired
     private ExternalResourceDAO resourceDAO;
@@ -51,7 +51,7 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, String> implements V
                 append(JPAVirSchema.class.getSimpleName()).
                 append(" e WHERE ");
         for (AnyTypeClass anyTypeClass : anyTypeClasses) {
-            queryString.append("e.anyTypeClass.name='").append(anyTypeClass.getKey()).append("' OR ");
+            queryString.append("e.anyTypeClass.key='").append(anyTypeClass.getKey()).append("' OR ");
         }
 
         TypedQuery<VirSchema> query = entityManager().createQuery(

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java
index ca29980..e9e71fa 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java
@@ -28,12 +28,10 @@ import org.apache.syncope.core.persistence.api.entity.AnnotatedEntity;
 
 /**
  * Abstract wrapper for common system information.
- *
- * @param <KEY> the type of the key of this entity
  */
 @MappedSuperclass
 @EntityListeners(value = AnnotatedEntityListener.class)
-public abstract class AbstractAnnotatedEntity<KEY> extends AbstractEntity<KEY> implements AnnotatedEntity<KEY> {
+public abstract class AbstractAnnotatedEntity extends AbstractGeneratedKeyEntity implements AnnotatedEntity {
 
     private static final long serialVersionUID = -4801685541488201219L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
index ad38542..496e689 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
@@ -37,9 +37,7 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.AnyCheck;
 
 @AnyCheck
 @MappedSuperclass
-public abstract class AbstractAny<P extends PlainAttr<?>>
-        extends AbstractAnnotatedEntity<Long>
-        implements Any<P> {
+public abstract class AbstractAny<P extends PlainAttr<?>> extends AbstractAnnotatedEntity implements Any<P> {
 
     private static final long serialVersionUID = -2666540708092702810L;
 
@@ -105,7 +103,7 @@ public abstract class AbstractAny<P extends PlainAttr<?>>
     @Override
     public List<String> getResourceNames() {
         return CollectionUtils.collect(
-                getResources(), EntityUtils.<String, ExternalResource>keyTransformer(), new ArrayList<String>());
+                getResources(), EntityUtils.<ExternalResource>keyTransformer(), new ArrayList<String>());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
index 0b77dac..f872339 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
@@ -25,7 +25,7 @@ import org.apache.syncope.core.persistence.api.entity.DynMembership;
 
 @MappedSuperclass
 public abstract class AbstractDynMembership<A extends Any<?>>
-        extends AbstractEntity<Long> implements DynMembership<A> {
+        extends AbstractGeneratedKeyEntity implements DynMembership<A> {
 
     private static final long serialVersionUID = 921821654690948787L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java
index d66e9d2..08c367d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java
@@ -29,7 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 
-public abstract class AbstractEntity<KEY> implements Entity<KEY> {
+public abstract class AbstractEntity implements Entity {
 
     private static final long serialVersionUID = -9017214159540857901L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java
index c3c63ee..d27dba2 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractExec.java
@@ -29,7 +29,7 @@ import javax.validation.constraints.NotNull;
 import org.apache.syncope.core.persistence.api.entity.Exec;
 
 @MappedSuperclass
-public abstract class AbstractExec extends AbstractEntity<Long> implements Exec {
+public abstract class AbstractExec extends AbstractGeneratedKeyEntity implements Exec {
 
     private static final long serialVersionUID = -812344822970166317L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGeneratedKeyEntity.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGeneratedKeyEntity.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGeneratedKeyEntity.java
new file mode 100644
index 0000000..c3924c8
--- /dev/null
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGeneratedKeyEntity.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.persistence.jpa.entity;
+
+import javax.persistence.Column;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+@MappedSuperclass
+public abstract class AbstractGeneratedKeyEntity extends AbstractEntity {
+
+    private static final long serialVersionUID = 4705587655441599524L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "uuid")
+    @Column(length = 36)
+    private String key;
+
+    @Override
+    public String getKey() {
+        return key;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
index f892a8d..5c95118 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
@@ -38,13 +38,13 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.PlainAttrCheck;
 
 @MappedSuperclass
 @PlainAttrCheck
-public abstract class AbstractPlainAttr<O extends Any<?>> extends AbstractEntity<Long> implements PlainAttr<O> {
+public abstract class AbstractPlainAttr<O extends Any<?>> extends AbstractGeneratedKeyEntity implements PlainAttr<O> {
 
     private static final long serialVersionUID = -9115431608821806124L;
 
     @NotNull
     @ManyToOne(fetch = FetchType.EAGER)
-    @Column(name = "schema_name")
+    @Column(name = "schema_key")
     protected JPAPlainSchema schema;
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
index 21f835b..bac48c6 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttrValue.java
@@ -33,7 +33,6 @@ import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
-import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidPlainAttrValueException;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
@@ -42,7 +41,7 @@ import org.apache.syncope.core.spring.security.Encryptor;
 
 @MappedSuperclass
 @PlainAttrValueCheck
-public abstract class AbstractPlainAttrValue extends AbstractEntity<Long> implements PlainAttrValue {
+public abstract class AbstractPlainAttrValue extends AbstractGeneratedKeyEntity implements PlainAttrValue {
 
     private static final long serialVersionUID = -9141923816611244785L;
 
@@ -232,10 +231,7 @@ public abstract class AbstractPlainAttrValue extends AbstractEntity<Long> implem
 
     @Override
     public String getValueAsString(final AttrSchemaType type) {
-        Exception exception = null;
-
-        String result = null;
-
+        String result;
         switch (type) {
 
             case Boolean:
@@ -260,8 +256,8 @@ public abstract class AbstractPlainAttrValue extends AbstractEntity<Long> implem
                 result = getAttr() == null || getAttr().getSchema() == null
                         || getAttr().getSchema().getConversionPattern() == null
                                 ? FormatUtils.format(getDateValue())
-                                : FormatUtils.format(getDateValue(), false, getAttr().getSchema().
-                                        getConversionPattern());
+                                : FormatUtils.format(
+                                        getDateValue(), false, getAttr().getSchema().getConversionPattern());
                 break;
 
             case Binary:
@@ -276,11 +272,6 @@ public abstract class AbstractPlainAttrValue extends AbstractEntity<Long> implem
                 break;
         }
 
-        if (exception != null) {
-            throw new InvalidPlainAttrValueException(
-                    "While trying to format '" + getValue() + "' as " + type, exception);
-        }
-
         return result;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractProvidedKeyEntity.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractProvidedKeyEntity.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractProvidedKeyEntity.java
new file mode 100644
index 0000000..49b6713
--- /dev/null
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractProvidedKeyEntity.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.persistence.jpa.entity;
+
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import org.apache.syncope.core.persistence.api.entity.ProvidedKeyEntity;
+
+@MappedSuperclass
+public abstract class AbstractProvidedKeyEntity extends AbstractEntity implements ProvidedKeyEntity {
+
+    private static final long serialVersionUID = 821537874069666593L;
+
+    @Id
+    private String key;
+
+    @Override
+    public String getKey() {
+        return key;
+    }
+
+    @Override
+    public void setKey(final String key) {
+        this.key = key;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
index 23a3815..155aa2b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
@@ -32,7 +32,7 @@ public class AnnotatedEntityListener {
 
     @PrePersist
     @PreUpdate
-    public void setSysInfo(final AnnotatedEntity<?> entity) {
+    public void setSysInfo(final AnnotatedEntity entity) {
         String username = AuthContextUtils.getUsername();
         LOG.debug("Set system properties for '{}'", entity);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyAbout.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyAbout.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyAbout.java
index e142820..3839be5 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyAbout.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyAbout.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.persistence.jpa.entity;
 
 import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
@@ -30,16 +29,13 @@ import org.apache.syncope.core.persistence.api.entity.Notification;
 
 @Entity
 @Table(name = JPAAnyAbout.TABLE, uniqueConstraints =
-        @UniqueConstraint(columnNames = { "notification_id", "anyType_name" }))
-public class JPAAnyAbout extends AbstractEntity<Long> implements AnyAbout {
+        @UniqueConstraint(columnNames = { "notification_key", "anyType_key" }))
+public class JPAAnyAbout extends AbstractGeneratedKeyEntity implements AnyAbout {
 
     private static final long serialVersionUID = 3517381731849788407L;
 
     public static final String TABLE = "AnyAbout";
 
-    @Id
-    private Long id;
-
     @ManyToOne
     private JPANotification notification;
 
@@ -50,11 +46,6 @@ public class JPAAnyAbout extends AbstractEntity<Long> implements AnyAbout {
     private String filter;
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public Notification getNotification() {
         return notification;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTemplateRealm.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTemplateRealm.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTemplateRealm.java
index cdb4b5e..911eeaf 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTemplateRealm.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTemplateRealm.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.persistence.jpa.entity;
 
 import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
@@ -29,25 +28,17 @@ import org.apache.syncope.core.persistence.jpa.entity.resource.AbstractAnyTempla
 
 @Entity
 @Table(name = JPAAnyTemplateRealm.TABLE, uniqueConstraints =
-        @UniqueConstraint(columnNames = { "realm_id", "anyType_name" }))
+        @UniqueConstraint(columnNames = { "realm_key", "anyType_key" }))
 public class JPAAnyTemplateRealm extends AbstractAnyTemplate implements AnyTemplateRealm {
 
     public static final String TABLE = "AnyTemplateRealm";
 
     private static final long serialVersionUID = 1863029633568957907L;
 
-    @Id
-    private Long id;
-
     @ManyToOne
     private JPARealm realm;
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public Realm getRealm() {
         return realm;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
index 64cd644..272716c 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
@@ -25,7 +25,6 @@ import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
@@ -40,37 +39,24 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.AnyTypeCheck;
 @Table(name = JPAAnyType.TABLE)
 @AnyTypeCheck
 @Cacheable
-public class JPAAnyType extends AbstractEntity<String> implements AnyType {
+public class JPAAnyType extends AbstractProvidedKeyEntity implements AnyType {
 
     private static final long serialVersionUID = 2668267884059219835L;
 
     public static final String TABLE = "AnyType";
 
-    @Id
-    private String name;
-
     @NotNull
     @Enumerated(EnumType.STRING)
     private AnyTypeKind kind;
 
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(joinColumns =
-            @JoinColumn(name = "anyType_name", referencedColumnName = "name"),
+            @JoinColumn(name = "anyType_key", referencedColumnName = "key"),
             inverseJoinColumns =
-            @JoinColumn(name = "anyTypeClass_name", referencedColumnName = "name"))
+            @JoinColumn(name = "anyTypeClass_key", referencedColumnName = "key"))
     private List<JPAAnyTypeClass> classes = new ArrayList<>();
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String name) {
-        this.name = name;
-    }
-
-    @Override
     public AnyTypeKind getKind() {
         return kind;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
index 58d5eb1..5fb64aa 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
@@ -23,7 +23,6 @@ import java.util.List;
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.ManyToMany;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
@@ -35,15 +34,12 @@ import org.apache.syncope.core.persistence.api.entity.VirSchema;
 @Entity
 @Table(name = JPAAnyTypeClass.TABLE)
 @Cacheable
-public class JPAAnyTypeClass extends AbstractEntity<String> implements AnyTypeClass {
+public class JPAAnyTypeClass extends AbstractProvidedKeyEntity implements AnyTypeClass {
 
     private static final long serialVersionUID = -1750247153774475453L;
 
     public static final String TABLE = "AnyTypeClass";
 
-    @Id
-    private String name;
-
     @ManyToMany(fetch = FetchType.EAGER, mappedBy = "classes")
     private List<JPAAnyType> types = new ArrayList<>();
 
@@ -57,16 +53,6 @@ public class JPAAnyTypeClass extends AbstractEntity<String> implements AnyTypeCl
     private List<JPAVirSchema> virSchemas = new ArrayList<>();
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String name) {
-        this.name = name;
-    }
-
-    @Override
     public boolean add(final PlainSchema schema) {
         checkType(schema, JPAPlainSchema.class);
         return this.plainSchemas.add((JPAPlainSchema) schema);

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
index 22c632a..a4d6eea 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
@@ -99,7 +99,7 @@ public class JPAAnyUtils implements AnyUtils {
 
     @Override
     public <T extends PlainAttr<?>> Class<T> plainAttrClass() {
-        Class result = null;
+        Class result;
 
         switch (anyTypeKind) {
             case GROUP:

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
index f018670..a059354 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
@@ -30,7 +30,6 @@ import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.Lob;
 import javax.persistence.OneToMany;
@@ -50,7 +49,7 @@ import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResour
 @Entity
 @Table(name = JPAConnInstance.TABLE)
 @ConnInstanceCheck
-public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstance {
+public class JPAConnInstance extends AbstractGeneratedKeyEntity implements ConnInstance {
 
     private static final long serialVersionUID = -2294708794497208872L;
 
@@ -58,9 +57,6 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
 
     private static final int DEFAULT_TIMEOUT = 10;
 
-    @Id
-    private Long id;
-
     /**
      * URI identifying the local / remote ConnId location where the related connector bundle is found.
      */
@@ -99,7 +95,7 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
     @Column(name = "capability")
     @CollectionTable(name = "ConnInstance_capabilities",
             joinColumns =
-            @JoinColumn(name = "connInstance_id", referencedColumnName = "id"))
+            @JoinColumn(name = "connInstance_key", referencedColumnName = "key"))
     private Set<ConnectorCapability> capabilities = new HashSet<>();
 
     /**
@@ -129,11 +125,6 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
     private JPAConnPoolConf poolConf;
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public String getLocation() {
         return location;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
index 45eea22..7270093 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
@@ -21,28 +21,24 @@ package org.apache.syncope.core.persistence.jpa.entity;
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.jpa.validation.entity.SchemaNameCheck;
+import org.apache.syncope.core.persistence.jpa.validation.entity.SchemaKeyCheck;
 
 @Entity
 @Table(name = JPADerSchema.TABLE)
 @Cacheable
-@SchemaNameCheck
-public class JPADerSchema extends AbstractEntity<String> implements DerSchema {
+@SchemaKeyCheck
+public class JPADerSchema extends AbstractProvidedKeyEntity implements DerSchema {
 
     private static final long serialVersionUID = -6173643493348674060L;
 
     public static final String TABLE = "DerSchema";
 
-    @Id
-    private String name;
-
     @OneToOne(fetch = FetchType.EAGER)
     private JPAAnyTypeClass anyTypeClass;
 
@@ -50,16 +46,6 @@ public class JPADerSchema extends AbstractEntity<String> implements DerSchema {
     private String expression;
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String key) {
-        this.name = key;
-    }
-
-    @Override
     public AnyTypeClass getAnyTypeClass() {
         return anyTypeClass;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADomain.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADomain.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADomain.java
index f9bb394..5e6a80f 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADomain.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADomain.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.persistence.jpa.entity;
 import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
-import javax.persistence.Id;
 import javax.persistence.Table;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.core.spring.security.Encryptor;
@@ -31,31 +30,18 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.DomainCheck;
 @Entity
 @Table(name = JPADomain.TABLE)
 @DomainCheck
-public class JPADomain extends AbstractEntity<String> implements Domain {
+public class JPADomain extends AbstractProvidedKeyEntity implements Domain {
 
     private static final long serialVersionUID = -5891241943464285840L;
 
     public static final String TABLE = "SyncopeDomain";
 
-    @Id
-    private String name;
-
     private String adminPwd;
 
     @Enumerated(EnumType.STRING)
     private CipherAlgorithm adminCipherAlgorithm;
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String name) {
-        this.name = name;
-    }
-
-    @Override
     public String getAdminPwd() {
         return adminPwd;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
index 881f509..7f0a673 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
@@ -127,127 +127,127 @@ public class JPAEntityFactory implements EntityFactory {
 
     @SuppressWarnings("unchecked")
     @Override
-    public <KEY, T extends Entity<KEY>> T newEntity(final Class<T> reference) {
-        T result;
+    public <E extends Entity> E newEntity(final Class<E> reference) {
+        E result;
 
         if (reference.equals(Domain.class)) {
-            result = (T) new JPADomain();
+            result = (E) new JPADomain();
         } else if (reference.equals(Realm.class)) {
-            result = (T) new JPARealm();
+            result = (E) new JPARealm();
         } else if (reference.equals(AnyTemplateRealm.class)) {
-            result = (T) new JPAAnyTemplateRealm();
+            result = (E) new JPAAnyTemplateRealm();
         } else if (reference.equals(AccountPolicy.class)) {
-            result = (T) new JPAAccountPolicy();
+            result = (E) new JPAAccountPolicy();
         } else if (reference.equals(PasswordPolicy.class)) {
-            result = (T) new JPAPasswordPolicy();
+            result = (E) new JPAPasswordPolicy();
         } else if (reference.equals(PushPolicy.class)) {
-            result = (T) new JPAPushPolicy();
+            result = (E) new JPAPushPolicy();
         } else if (reference.equals(PullPolicy.class)) {
-            result = (T) new JPAPullPolicy();
+            result = (E) new JPAPullPolicy();
         } else if (reference.equals(AnyTypeClass.class)) {
-            result = (T) new JPAAnyTypeClass();
+            result = (E) new JPAAnyTypeClass();
         } else if (reference.equals(AnyType.class)) {
-            result = (T) new JPAAnyType();
+            result = (E) new JPAAnyType();
         } else if (reference.equals(AnyObject.class)) {
-            result = (T) new JPAAnyObject();
+            result = (E) new JPAAnyObject();
         } else if (reference.equals(Role.class)) {
-            result = (T) new JPARole();
+            result = (E) new JPARole();
         } else if (reference.equals(User.class)) {
-            result = (T) new JPAUser();
+            result = (E) new JPAUser();
         } else if (reference.equals(Group.class)) {
-            result = (T) new JPAGroup();
+            result = (E) new JPAGroup();
         } else if (reference.equals(TypeExtension.class)) {
-            result = (T) new JPATypeExtension();
+            result = (E) new JPATypeExtension();
         } else if (reference.equals(RelationshipType.class)) {
-            result = (T) new JPARelationshipType();
+            result = (E) new JPARelationshipType();
         } else if (reference.equals(ARelationship.class)) {
-            result = (T) new JPAARelationship();
+            result = (E) new JPAARelationship();
         } else if (reference.equals(URelationship.class)) {
-            result = (T) new JPAURelationship();
+            result = (E) new JPAURelationship();
         } else if (reference.equals(AMembership.class)) {
-            result = (T) new JPAAMembership();
+            result = (E) new JPAAMembership();
         } else if (reference.equals(UMembership.class)) {
-            result = (T) new JPAUMembership();
+            result = (E) new JPAUMembership();
         } else if (reference.equals(Conf.class)) {
-            result = (T) new JPAConf();
+            result = (E) new JPAConf();
         } else if (reference.equals(AnyAbout.class)) {
-            result = (T) new JPAAnyAbout();
+            result = (E) new JPAAnyAbout();
         } else if (reference.equals(MailTemplate.class)) {
-            result = (T) new JPAMailTemplate();
+            result = (E) new JPAMailTemplate();
         } else if (reference.equals(Notification.class)) {
-            result = (T) new JPANotification();
+            result = (E) new JPANotification();
         } else if (reference.equals(ExternalResource.class)) {
-            result = (T) new JPAExternalResource();
+            result = (E) new JPAExternalResource();
         } else if (reference.equals(Provision.class)) {
-            result = (T) new JPAProvision();
+            result = (E) new JPAProvision();
         } else if (reference.equals(ConnInstance.class)) {
-            result = (T) new JPAConnInstance();
+            result = (E) new JPAConnInstance();
         } else if (reference.equals(PlainSchema.class)) {
-            result = (T) new JPAPlainSchema();
+            result = (E) new JPAPlainSchema();
         } else if (reference.equals(APlainAttr.class)) {
-            result = (T) new JPAAPlainAttr();
+            result = (E) new JPAAPlainAttr();
         } else if (reference.equals(APlainAttrValue.class)) {
-            result = (T) new JPAAPlainAttrValue();
+            result = (E) new JPAAPlainAttrValue();
         } else if (reference.equals(APlainAttrUniqueValue.class)) {
-            result = (T) new JPAAPlainAttrUniqueValue();
+            result = (E) new JPAAPlainAttrUniqueValue();
         } else if (reference.equals(UPlainAttr.class)) {
-            result = (T) new JPAUPlainAttr();
+            result = (E) new JPAUPlainAttr();
         } else if (reference.equals(UPlainAttrValue.class)) {
-            result = (T) new JPAUPlainAttrValue();
+            result = (E) new JPAUPlainAttrValue();
         } else if (reference.equals(UPlainAttrUniqueValue.class)) {
-            result = (T) new JPAUPlainAttrUniqueValue();
+            result = (E) new JPAUPlainAttrUniqueValue();
         } else if (reference.equals(DerSchema.class)) {
-            result = (T) new JPADerSchema();
+            result = (E) new JPADerSchema();
         } else if (reference.equals(VirSchema.class)) {
-            result = (T) new JPAVirSchema();
+            result = (E) new JPAVirSchema();
         } else if (reference.equals(Mapping.class)) {
-            result = (T) new JPAMapping();
+            result = (E) new JPAMapping();
         } else if (reference.equals(MappingItem.class)) {
-            result = (T) new JPAMappingItem();
+            result = (E) new JPAMappingItem();
         } else if (reference.equals(GPlainAttr.class)) {
-            result = (T) new JPAGPlainAttr();
+            result = (E) new JPAGPlainAttr();
         } else if (reference.equals(GPlainAttrValue.class)) {
-            result = (T) new JPAGPlainAttrValue();
+            result = (E) new JPAGPlainAttrValue();
         } else if (reference.equals(GPlainAttrUniqueValue.class)) {
-            result = (T) new JPAGPlainAttrUniqueValue();
+            result = (E) new JPAGPlainAttrUniqueValue();
         } else if (reference.equals(CPlainAttr.class)) {
-            result = (T) new JPACPlainAttr();
+            result = (E) new JPACPlainAttr();
         } else if (reference.equals(CPlainAttrValue.class)) {
-            result = (T) new JPACPlainAttrValue();
+            result = (E) new JPACPlainAttrValue();
         } else if (reference.equals(CPlainAttrUniqueValue.class)) {
-            result = (T) new JPACPlainAttrUniqueValue();
+            result = (E) new JPACPlainAttrUniqueValue();
         } else if (reference.equals(Report.class)) {
-            result = (T) new JPAReport();
+            result = (E) new JPAReport();
         } else if (reference.equals(ReportTemplate.class)) {
-            result = (T) new JPAReportTemplate();
+            result = (E) new JPAReportTemplate();
         } else if (reference.equals(ReportExec.class)) {
-            result = (T) new JPAReportExec();
+            result = (E) new JPAReportExec();
         } else if (reference.equals(NotificationTask.class)) {
-            result = (T) new JPANotificationTask();
+            result = (E) new JPANotificationTask();
         } else if (reference.equals(PropagationTask.class)) {
-            result = (T) new JPAPropagationTask();
+            result = (E) new JPAPropagationTask();
         } else if (reference.equals(PushTask.class)) {
-            result = (T) new JPAPushTask();
+            result = (E) new JPAPushTask();
         } else if (reference.equals(PullTask.class)) {
-            result = (T) new JPAPullTask();
+            result = (E) new JPAPullTask();
         } else if (reference.equals(SchedTask.class)) {
-            result = (T) new JPASchedTask();
+            result = (E) new JPASchedTask();
         } else if (reference.equals(TaskExec.class)) {
-            result = (T) new JPATaskExec();
+            result = (E) new JPATaskExec();
         } else if (reference.equals(PushTaskAnyFilter.class)) {
-            result = (T) new JPAPushTaskAnyFilter();
+            result = (E) new JPAPushTaskAnyFilter();
         } else if (reference.equals(AnyTemplatePullTask.class)) {
-            result = (T) new JPAAnyTemplatePullTask();
+            result = (E) new JPAAnyTemplatePullTask();
         } else if (reference.equals(SecurityQuestion.class)) {
-            result = (T) new JPASecurityQuestion();
+            result = (E) new JPASecurityQuestion();
         } else if (reference.equals(Logger.class)) {
-            result = (T) new JPALogger();
+            result = (E) new JPALogger();
         } else if (reference.equals(DynRoleMembership.class)) {
-            result = (T) new JPADynRoleMembership();
+            result = (E) new JPADynRoleMembership();
         } else if (reference.equals(ADynGroupMembership.class)) {
-            result = (T) new JPAADynGroupMembership();
+            result = (E) new JPAADynGroupMembership();
         } else if (reference.equals(UDynGroupMembership.class)) {
-            result = (T) new JPAUDynGroupMembership();
+            result = (E) new JPAUDynGroupMembership();
         } else {
             throw new IllegalArgumentException("Could not find a JPA implementation of " + reference.getName());
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPALogger.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPALogger.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPALogger.java
index 3704055..ce5e1ab 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPALogger.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPALogger.java
@@ -30,7 +30,7 @@ import org.apache.syncope.core.persistence.api.entity.Logger;
 
 @Entity
 @Table(name = JPALogger.TABLE)
-public class JPALogger extends AbstractEntity<String> implements Logger {
+public class JPALogger extends AbstractEntity implements Logger {
 
     private static final long serialVersionUID = 943012777014416027L;
 
@@ -38,7 +38,7 @@ public class JPALogger extends AbstractEntity<String> implements Logger {
 
     @Id
     @Column(name = "logName")
-    private String name;
+    private String key;
 
     @Column(name = "logLevel", nullable = false)
     @Enumerated(EnumType.STRING)
@@ -50,12 +50,12 @@ public class JPALogger extends AbstractEntity<String> implements Logger {
 
     @Override
     public String getKey() {
-        return name;
+        return key;
     }
 
     @Override
     public void setKey(final String name) {
-        this.name = name;
+        this.key = name;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAMailTemplate.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAMailTemplate.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAMailTemplate.java
index 2678df2..fee18fd 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAMailTemplate.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAMailTemplate.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.persistence.jpa.entity;
 
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.Table;
 import org.apache.syncope.core.persistence.api.entity.MailTemplate;
@@ -28,15 +27,12 @@ import org.apache.syncope.core.persistence.api.entity.MailTemplate;
 @Entity
 @Table(name = JPAMailTemplate.TABLE)
 @Cacheable
-public class JPAMailTemplate extends AbstractEntity<String> implements MailTemplate {
+public class JPAMailTemplate extends AbstractProvidedKeyEntity implements MailTemplate {
 
     private static final long serialVersionUID = 2668267884059219835L;
 
     public static final String TABLE = "MailTemplate";
 
-    @Id
-    private String name;
-
     @Lob
     private String textTemplate;
 
@@ -44,16 +40,6 @@ public class JPAMailTemplate extends AbstractEntity<String> implements MailTempl
     private String htmlTemplate;
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String name) {
-        this.name = name;
-    }
-
-    @Override
     public String getTextTemplate() {
         return textTemplate;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
index 2202a12..73ce78f 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
@@ -29,7 +29,6 @@ import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
@@ -50,20 +49,17 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.NotificationChe
 @Entity
 @Table(name = JPANotification.TABLE)
 @NotificationCheck
-public class JPANotification extends AbstractEntity<Long> implements Notification {
+public class JPANotification extends AbstractGeneratedKeyEntity implements Notification {
 
     private static final long serialVersionUID = 3112582296912757537L;
 
     public static final String TABLE = "Notification";
 
-    @Id
-    private Long id;
-
     @ElementCollection(fetch = FetchType.EAGER)
     @Column(name = "event")
     @CollectionTable(name = "Notification_events",
             joinColumns =
-            @JoinColumn(name = "notification_id", referencedColumnName = "id"))
+            @JoinColumn(name = "notification_key", referencedColumnName = "key"))
     private List<String> events;
 
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "notification")
@@ -74,7 +70,7 @@ public class JPANotification extends AbstractEntity<Long> implements Notificatio
     @ElementCollection(fetch = FetchType.EAGER)
     @CollectionTable(name = "Notification_staticRecipients",
             joinColumns =
-            @JoinColumn(name = "notification_id", referencedColumnName = "id"))
+            @JoinColumn(name = "notification_key", referencedColumnName = "key"))
     @Column(name = "staticRecipients")
     private List<String> staticRecipients;
 
@@ -100,7 +96,7 @@ public class JPANotification extends AbstractEntity<Long> implements Notificatio
     private String subject;
 
     @ManyToOne(fetch = FetchType.EAGER, optional = false)
-    @JoinColumn(name = "template_name")
+    @JoinColumn(name = "template_key")
     private JPAMailTemplate template;
 
     @NotNull
@@ -123,11 +119,6 @@ public class JPANotification extends AbstractEntity<Long> implements Notificatio
     }
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public String getRecipientsFIQL() {
         return recipientsFIQL;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
index 4ba6fa3..02b3ff7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
@@ -25,7 +25,6 @@ import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
@@ -41,21 +40,18 @@ import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.jpa.attrvalue.validation.BasicValidator;
 import org.apache.syncope.core.persistence.jpa.validation.entity.PlainSchemaCheck;
-import org.apache.syncope.core.persistence.jpa.validation.entity.SchemaNameCheck;
+import org.apache.syncope.core.persistence.jpa.validation.entity.SchemaKeyCheck;
 
 @Entity
 @Table(name = JPAPlainSchema.TABLE)
 @PlainSchemaCheck
-@SchemaNameCheck
-public class JPAPlainSchema extends AbstractEntity<String> implements PlainSchema {
+@SchemaKeyCheck
+public class JPAPlainSchema extends AbstractProvidedKeyEntity implements PlainSchema {
 
     private static final long serialVersionUID = -8621028596062054739L;
 
     public static final String TABLE = "PlainSchema";
 
-    @Id
-    private String name;
-
     @OneToOne(fetch = FetchType.EAGER)
     private JPAAnyTypeClass anyTypeClass;
 
@@ -119,16 +115,6 @@ public class JPAPlainSchema extends AbstractEntity<String> implements PlainSchem
     }
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String name) {
-        this.name = name;
-    }
-
-    @Override
     public AnyTypeClass getAnyTypeClass() {
         return anyTypeClass;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
index 5455168..719f9a8 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
@@ -29,7 +29,6 @@ import javax.persistence.Column;
 import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
@@ -52,18 +51,15 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.RealmCheck;
 
 @Entity
 @Table(name = JPARealm.TABLE, uniqueConstraints =
-        @UniqueConstraint(columnNames = { "name", "parent_id" }))
+        @UniqueConstraint(columnNames = { "key", "parent_key" }))
 @Cacheable
 @RealmCheck
-public class JPARealm extends AbstractEntity<Long> implements Realm {
+public class JPARealm extends AbstractGeneratedKeyEntity implements Realm {
 
     private static final long serialVersionUID = 5533247460239909964L;
 
     public static final String TABLE = "Realm";
 
-    @Id
-    private Long id;
-
     @Size(min = 1)
     private String name;
 
@@ -80,18 +76,13 @@ public class JPARealm extends AbstractEntity<Long> implements Realm {
     @Column(name = "actionClassName")
     @CollectionTable(name = "Realm_actionsClassNames",
             joinColumns =
-            @JoinColumn(name = "realm_id", referencedColumnName = "id"))
+            @JoinColumn(name = "realm_key", referencedColumnName = "key"))
     private Set<String> actionsClassNames = new HashSet<>();
 
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "realm")
     private List<JPAAnyTemplateRealm> templates = new ArrayList<>();
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public String getName() {
         return name;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARelationshipType.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARelationshipType.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARelationshipType.java
index f3fc882..a1b58c7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARelationshipType.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARelationshipType.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.persistence.jpa.entity;
 
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.Table;
 import org.apache.syncope.core.persistence.api.entity.RelationshipType;
 import org.apache.syncope.core.persistence.jpa.validation.entity.RelationshipTypeCheck;
@@ -29,28 +28,15 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.RelationshipTyp
 @Table(name = JPARelationshipType.TABLE)
 @RelationshipTypeCheck
 @Cacheable
-public class JPARelationshipType extends AbstractEntity<String> implements RelationshipType {
+public class JPARelationshipType extends AbstractProvidedKeyEntity implements RelationshipType {
 
     private static final long serialVersionUID = -753673974614737065L;
 
     public static final String TABLE = "RelationshipType";
 
-    @Id
-    private String name;
-
     private String description;
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String name) {
-        this.name = name;
-    }
-
-    @Override
     public String getDescription() {
         return description;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java
index 2c40c51..cb9e029 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java
@@ -25,7 +25,6 @@ import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
@@ -44,15 +43,12 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.ReportCheck;
 @Entity
 @Table(name = JPAReport.TABLE)
 @ReportCheck
-public class JPAReport extends AbstractEntity<Long> implements Report {
+public class JPAReport extends AbstractGeneratedKeyEntity implements Report {
 
     private static final long serialVersionUID = -587652654964285834L;
 
     public static final String TABLE = "Report";
 
-    @Id
-    private Long id;
-
     @Column(unique = true, nullable = false)
     private String name;
 
@@ -71,15 +67,10 @@ public class JPAReport extends AbstractEntity<Long> implements Report {
     private Integer active;
 
     @ManyToOne(fetch = FetchType.EAGER, optional = false)
-    @JoinColumn(name = "template_name")
+    @JoinColumn(name = "template_key")
     private JPAReportTemplate template;
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public String getName() {
         return name;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportExec.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportExec.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportExec.java
index f5f0777..249e61b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportExec.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportExec.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.persistence.jpa.entity;
 import javax.persistence.Basic;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
@@ -38,9 +37,6 @@ public class JPAReportExec extends AbstractExec implements ReportExec {
 
     public static final String TABLE = "ReportExec";
 
-    @Id
-    private Long id;
-
     /**
      * The referred report.
      */
@@ -55,11 +51,6 @@ public class JPAReportExec extends AbstractExec implements ReportExec {
     private Byte[] execResult;
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public Report getReport() {
         return report;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportTemplate.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportTemplate.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportTemplate.java
index 7551411..408c594 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportTemplate.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportTemplate.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.persistence.jpa.entity;
 
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.Table;
 import org.apache.syncope.core.persistence.api.entity.ReportTemplate;
@@ -28,15 +27,12 @@ import org.apache.syncope.core.persistence.api.entity.ReportTemplate;
 @Entity
 @Table(name = JPAReportTemplate.TABLE)
 @Cacheable
-public class JPAReportTemplate extends AbstractEntity<String> implements ReportTemplate {
+public class JPAReportTemplate extends AbstractProvidedKeyEntity implements ReportTemplate {
 
     private static final long serialVersionUID = 7755855927366231089L;
 
     public static final String TABLE = "ReportTemplate";
 
-    @Id
-    private String name;
-
     @Lob
     private String foTemplate;
 
@@ -47,16 +43,6 @@ public class JPAReportTemplate extends AbstractEntity<String> implements ReportT
     private String htmlTemplate;
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String name) {
-        this.name = name;
-    }
-
-    @Override
     public String getFOTemplate() {
         return foTemplate;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java
index d744976..1fe7c37 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.persistence.jpa.entity;
 
 import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
@@ -29,26 +28,18 @@ import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 
 @Entity
 @Table(name = JPAReportletConfInstance.TABLE)
-public class JPAReportletConfInstance extends AbstractEntity<Long> {
+public class JPAReportletConfInstance extends AbstractGeneratedKeyEntity {
 
     private static final long serialVersionUID = -2436055132955674610L;
 
     public static final String TABLE = "ReportletConfInstance";
 
-    @Id
-    private Long id;
-
     @Lob
     private String serializedInstance;
 
     @ManyToOne
     private JPAReport report;
 
-    @Override
-    public Long getKey() {
-        return id;
-    }
-
     public Report getReport() {
         return report;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
index d2c6dc0..cc8aa68 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity;
 
-import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -30,7 +29,6 @@ import javax.persistence.Column;
 import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
@@ -40,33 +38,31 @@ import javax.validation.Valid;
 import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.Role;
+import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership;
 import org.apache.syncope.core.persistence.jpa.validation.entity.RoleCheck;
 
 @Entity
 @Table(name = JPARole.TABLE)
 @Cacheable
 @RoleCheck
-public class JPARole extends AbstractEntity<String> implements Role {
+public class JPARole extends AbstractProvidedKeyEntity implements Role {
 
     private static final long serialVersionUID = -7657701119422588832L;
 
     public static final String TABLE = "SyncopeRole";
 
-    @Id
-    private String name;
-
     @ElementCollection(fetch = FetchType.EAGER)
     @Column(name = "entitlement")
     @CollectionTable(name = "SyncopeRole_entitlements",
             joinColumns =
-            @JoinColumn(name = "role_name", referencedColumnName = "name"))
+            @JoinColumn(name = "role_key", referencedColumnName = "key"))
     private Set<String> entitlements = new HashSet<>();
 
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(joinColumns =
-            @JoinColumn(name = "role_name"),
+            @JoinColumn(name = "role_key"),
             inverseJoinColumns =
-            @JoinColumn(name = "realm_id"))
+            @JoinColumn(name = "realm_key"))
     @Valid
     private List<JPARealm> realms = new ArrayList<>();
 
@@ -75,16 +71,6 @@ public class JPARole extends AbstractEntity<String> implements Role {
     private JPADynRoleMembership dynMembership;
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String name) {
-        this.name = name;
-    }
-
-    @Override
     public Set<String> getEntitlements() {
         return entitlements;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASecurityQuestion.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASecurityQuestion.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASecurityQuestion.java
index 324095e..ab6e9d5 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASecurityQuestion.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASecurityQuestion.java
@@ -20,30 +20,21 @@ package org.apache.syncope.core.persistence.jpa.entity;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.Table;
 import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
 
 @Entity
 @Table(name = JPASecurityQuestion.TABLE)
-public class JPASecurityQuestion extends AbstractEntity<Long> implements SecurityQuestion {
+public class JPASecurityQuestion extends AbstractGeneratedKeyEntity implements SecurityQuestion {
 
     private static final long serialVersionUID = 7675321820453579744L;
 
     public static final String TABLE = "SecurityQuestion";
 
-    @Id
-    private Long id;
-
     @Column(unique = true)
     private String content;
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public String getContent() {
         return content;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
index 0ee1606..8cf70ff 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
@@ -22,7 +22,6 @@ import javax.persistence.Basic;
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.Id;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
@@ -36,21 +35,18 @@ import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAProvision;
-import org.apache.syncope.core.persistence.jpa.validation.entity.SchemaNameCheck;
+import org.apache.syncope.core.persistence.jpa.validation.entity.SchemaKeyCheck;
 
 @Entity
 @Table(name = JPAVirSchema.TABLE)
 @Cacheable
-@SchemaNameCheck
-public class JPAVirSchema extends AbstractEntity<String> implements VirSchema {
+@SchemaKeyCheck
+public class JPAVirSchema extends AbstractProvidedKeyEntity implements VirSchema {
 
     private static final long serialVersionUID = 3274006935328590141L;
 
     public static final String TABLE = "VirSchema";
 
-    @Id
-    private String name;
-
     @OneToOne(fetch = FetchType.EAGER)
     private JPAAnyTypeClass anyTypeClass;
 
@@ -73,16 +69,6 @@ public class JPAVirSchema extends AbstractEntity<String> implements VirSchema {
     }
 
     @Override
-    public String getKey() {
-        return name;
-    }
-
-    @Override
-    public void setKey(final String key) {
-        this.name = key;
-    }
-
-    @Override
     public AnyTypeClass getAnyTypeClass() {
         return anyTypeClass;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/550ee4f4/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 b6ad613..b0ca6ea 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
@@ -21,7 +21,6 @@ package org.apache.syncope.core.persistence.jpa.entity.anyobject;
 import java.util.ArrayList;
 import java.util.List;
 import javax.persistence.Entity;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
@@ -44,9 +43,6 @@ public class JPAADynGroupMembership extends AbstractDynMembership<AnyObject> imp
 
     public static final String TABLE = "ADynGroupMembership";
 
-    @Id
-    private Long id;
-
     @OneToOne
     private JPAGroup group;
 
@@ -55,17 +51,12 @@ public class JPAADynGroupMembership extends AbstractDynMembership<AnyObject> imp
 
     @ManyToMany
     @JoinTable(joinColumns =
-            @JoinColumn(name = "aDynGroupMembership_id"),
+            @JoinColumn(name = "aDynGroupMembership_key"),
             inverseJoinColumns =
-            @JoinColumn(name = "anyObject_id"))
+            @JoinColumn(name = "anyObject_key"))
     private List<JPAAnyObject> anyObjects = new ArrayList<>();
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
     public Group getGroup() {
         return group;
     }