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 2015/01/02 18:21:57 UTC

syncope git commit: [SYNCOPE-620] Adding EntityFactory

Repository: syncope
Updated Branches:
  refs/heads/2_0_X ab462f08b -> f6938ea98


[SYNCOPE-620] Adding EntityFactory


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

Branch: refs/heads/2_0_X
Commit: f6938ea98c70983156836589c9dc4e42502fa1d3
Parents: ab462f0
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jan 2 18:21:46 2015 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jan 2 18:21:46 2015 +0100

----------------------------------------------------------------------
 syncope620/pom.xml                              |   2 +-
 .../persistence/api/entity/EntityFactory.java   |  26 ++
 .../jpa/entity/JPAEntityFactory.java            | 280 +++++++++++++++++++
 .../jpa/entity/JPAPasswordPolicy.java           |   2 +-
 .../syncope/persistence/jpa/AbstractTest.java   |   6 +
 .../persistence/jpa/entity/AttrTest.java        |  14 +-
 .../persistence/jpa/entity/ConfTest.java        |   8 +-
 .../jpa/entity/ConnInstanceTest.java            |   2 +-
 .../persistence/jpa/entity/DerAttrTest.java     |  30 +-
 .../persistence/jpa/entity/DerSchemaTest.java   |   5 +-
 .../persistence/jpa/entity/EntitlementTest.java |   2 +-
 .../persistence/jpa/entity/MembershipTest.java  |   3 +-
 .../jpa/entity/NotificationTest.java            |   6 +-
 .../persistence/jpa/entity/PlainSchemaTest.java |  12 +-
 .../persistence/jpa/entity/PolicyTest.java      |   6 +-
 .../persistence/jpa/entity/ReportTest.java      |   2 +-
 .../persistence/jpa/entity/ResourceTest.java    |  40 ++-
 .../persistence/jpa/entity/RoleTest.java        |   3 +-
 .../jpa/entity/SecurityQuestionTest.java        |   2 +-
 .../persistence/jpa/entity/TaskExecTest.java    |   4 +-
 .../persistence/jpa/entity/TaskTest.java        |   3 +-
 .../persistence/jpa/entity/UserTest.java        |  12 +-
 .../persistence/jpa/entity/VirAttrTest.java     |   9 +-
 .../persistence/jpa/entity/VirSchemaTest.java   |   5 +-
 .../persistence/jpa/relationship/AttrTest.java  |  15 +-
 .../jpa/relationship/MembershipTest.java        |   5 +-
 .../jpa/relationship/ReportTest.java            |   6 +-
 .../jpa/relationship/ResourceTest.java          |  17 +-
 .../persistence/jpa/relationship/RoleTest.java  |   5 +-
 .../persistence/jpa/relationship/TaskTest.java  |  10 +-
 30 files changed, 405 insertions(+), 137 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/pom.xml
----------------------------------------------------------------------
diff --git a/syncope620/pom.xml b/syncope620/pom.xml
index 7587710..f93f639 100644
--- a/syncope620/pom.xml
+++ b/syncope620/pom.xml
@@ -309,7 +309,7 @@ under the License.
     <connid.ldap.version>1.4.0</connid.ldap.version>
     <connid.ad.version>1.2.1</connid.ad.version>
 
-    <jackson.version>2.4.4</jackson.version>
+    <jackson.version>2.5.0</jackson.version>
 
     <spring.version>4.1.4.RELEASE</spring.version>
     <spring-security.version>3.2.5.RELEASE</spring-security.version>

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-api/src/main/java/org/apache/syncope/persistence/api/entity/EntityFactory.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-api/src/main/java/org/apache/syncope/persistence/api/entity/EntityFactory.java b/syncope620/server/persistence-api/src/main/java/org/apache/syncope/persistence/api/entity/EntityFactory.java
new file mode 100644
index 0000000..58af4f8
--- /dev/null
+++ b/syncope620/server/persistence-api/src/main/java/org/apache/syncope/persistence/api/entity/EntityFactory.java
@@ -0,0 +1,26 @@
+package org.apache.syncope.persistence.api.entity;
+
+/*
+ * 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.
+ */
+public interface EntityFactory {
+
+    <KEY, T extends Entity<KEY>> T newEntity(Class<T> reference);
+
+    <T extends Policy> T newPolicy(Class<T> reference, boolean global);
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAEntityFactory.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAEntityFactory.java b/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAEntityFactory.java
new file mode 100644
index 0000000..c404c53
--- /dev/null
+++ b/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAEntityFactory.java
@@ -0,0 +1,280 @@
+/*
+ * 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.persistence.jpa.entity;
+
+import org.apache.syncope.persistence.api.entity.AccountPolicy;
+import org.apache.syncope.persistence.api.entity.ConnInstance;
+import org.apache.syncope.persistence.api.entity.Entitlement;
+import org.apache.syncope.persistence.api.entity.Entity;
+import org.apache.syncope.persistence.api.entity.EntityFactory;
+import org.apache.syncope.persistence.api.entity.ExternalResource;
+import org.apache.syncope.persistence.api.entity.Notification;
+import org.apache.syncope.persistence.api.entity.PasswordPolicy;
+import org.apache.syncope.persistence.api.entity.Policy;
+import org.apache.syncope.persistence.api.entity.PushPolicy;
+import org.apache.syncope.persistence.api.entity.Report;
+import org.apache.syncope.persistence.api.entity.ReportExec;
+import org.apache.syncope.persistence.api.entity.ReportletConfInstance;
+import org.apache.syncope.persistence.api.entity.SyncPolicy;
+import org.apache.syncope.persistence.api.entity.conf.CPlainAttr;
+import org.apache.syncope.persistence.api.entity.conf.CPlainAttrUniqueValue;
+import org.apache.syncope.persistence.api.entity.conf.CPlainAttrValue;
+import org.apache.syncope.persistence.api.entity.conf.CPlainSchema;
+import org.apache.syncope.persistence.api.entity.conf.Conf;
+import org.apache.syncope.persistence.api.entity.membership.MDerAttr;
+import org.apache.syncope.persistence.api.entity.membership.MDerAttrTemplate;
+import org.apache.syncope.persistence.api.entity.membership.MDerSchema;
+import org.apache.syncope.persistence.api.entity.membership.MPlainAttr;
+import org.apache.syncope.persistence.api.entity.membership.MPlainAttrTemplate;
+import org.apache.syncope.persistence.api.entity.membership.MPlainAttrUniqueValue;
+import org.apache.syncope.persistence.api.entity.membership.MPlainAttrValue;
+import org.apache.syncope.persistence.api.entity.membership.MPlainSchema;
+import org.apache.syncope.persistence.api.entity.membership.MVirAttr;
+import org.apache.syncope.persistence.api.entity.membership.MVirAttrTemplate;
+import org.apache.syncope.persistence.api.entity.membership.MVirSchema;
+import org.apache.syncope.persistence.api.entity.membership.Membership;
+import org.apache.syncope.persistence.api.entity.role.RDerAttr;
+import org.apache.syncope.persistence.api.entity.role.RDerAttrTemplate;
+import org.apache.syncope.persistence.api.entity.role.RDerSchema;
+import org.apache.syncope.persistence.api.entity.role.RMapping;
+import org.apache.syncope.persistence.api.entity.role.RMappingItem;
+import org.apache.syncope.persistence.api.entity.role.RPlainAttr;
+import org.apache.syncope.persistence.api.entity.role.RPlainAttrTemplate;
+import org.apache.syncope.persistence.api.entity.role.RPlainAttrUniqueValue;
+import org.apache.syncope.persistence.api.entity.role.RPlainAttrValue;
+import org.apache.syncope.persistence.api.entity.role.RPlainSchema;
+import org.apache.syncope.persistence.api.entity.role.RVirAttr;
+import org.apache.syncope.persistence.api.entity.role.RVirAttrTemplate;
+import org.apache.syncope.persistence.api.entity.role.RVirSchema;
+import org.apache.syncope.persistence.api.entity.role.Role;
+import org.apache.syncope.persistence.api.entity.task.NotificationTask;
+import org.apache.syncope.persistence.api.entity.task.PropagationTask;
+import org.apache.syncope.persistence.api.entity.task.PushTask;
+import org.apache.syncope.persistence.api.entity.task.SchedTask;
+import org.apache.syncope.persistence.api.entity.task.SyncTask;
+import org.apache.syncope.persistence.api.entity.task.TaskExec;
+import org.apache.syncope.persistence.api.entity.user.SecurityQuestion;
+import org.apache.syncope.persistence.api.entity.user.UDerAttr;
+import org.apache.syncope.persistence.api.entity.user.UDerSchema;
+import org.apache.syncope.persistence.api.entity.user.UMapping;
+import org.apache.syncope.persistence.api.entity.user.UMappingItem;
+import org.apache.syncope.persistence.api.entity.user.UPlainAttr;
+import org.apache.syncope.persistence.api.entity.user.UPlainAttrUniqueValue;
+import org.apache.syncope.persistence.api.entity.user.UPlainAttrValue;
+import org.apache.syncope.persistence.api.entity.user.UPlainSchema;
+import org.apache.syncope.persistence.api.entity.user.UVirAttr;
+import org.apache.syncope.persistence.api.entity.user.UVirSchema;
+import org.apache.syncope.persistence.api.entity.user.User;
+import org.apache.syncope.persistence.jpa.entity.conf.JPACPlainAttr;
+import org.apache.syncope.persistence.jpa.entity.conf.JPACPlainAttrUniqueValue;
+import org.apache.syncope.persistence.jpa.entity.conf.JPACPlainAttrValue;
+import org.apache.syncope.persistence.jpa.entity.conf.JPACPlainSchema;
+import org.apache.syncope.persistence.jpa.entity.conf.JPAConf;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMDerAttr;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMDerAttrTemplate;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMDerSchema;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMPlainAttr;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMPlainAttrTemplate;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMPlainAttrUniqueValue;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMPlainAttrValue;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMPlainSchema;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMVirAttr;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMVirAttrTemplate;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMVirSchema;
+import org.apache.syncope.persistence.jpa.entity.membership.JPAMembership;
+import org.apache.syncope.persistence.jpa.entity.role.JPARDerAttr;
+import org.apache.syncope.persistence.jpa.entity.role.JPARDerAttrTemplate;
+import org.apache.syncope.persistence.jpa.entity.role.JPARDerSchema;
+import org.apache.syncope.persistence.jpa.entity.role.JPARMapping;
+import org.apache.syncope.persistence.jpa.entity.role.JPARMappingItem;
+import org.apache.syncope.persistence.jpa.entity.role.JPARPlainAttr;
+import org.apache.syncope.persistence.jpa.entity.role.JPARPlainAttrTemplate;
+import org.apache.syncope.persistence.jpa.entity.role.JPARPlainAttrUniqueValue;
+import org.apache.syncope.persistence.jpa.entity.role.JPARPlainAttrValue;
+import org.apache.syncope.persistence.jpa.entity.role.JPARPlainSchema;
+import org.apache.syncope.persistence.jpa.entity.role.JPARVirAttr;
+import org.apache.syncope.persistence.jpa.entity.role.JPARVirAttrTemplate;
+import org.apache.syncope.persistence.jpa.entity.role.JPARVirSchema;
+import org.apache.syncope.persistence.jpa.entity.role.JPARole;
+import org.apache.syncope.persistence.jpa.entity.task.JPANotificationTask;
+import org.apache.syncope.persistence.jpa.entity.task.JPAPropagationTask;
+import org.apache.syncope.persistence.jpa.entity.task.JPAPushTask;
+import org.apache.syncope.persistence.jpa.entity.task.JPASchedTask;
+import org.apache.syncope.persistence.jpa.entity.task.JPASyncTask;
+import org.apache.syncope.persistence.jpa.entity.task.JPATaskExec;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUDerAttr;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUDerSchema;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUMapping;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUMappingItem;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUPlainAttr;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUPlainAttrUniqueValue;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUPlainAttrValue;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUPlainSchema;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUVirAttr;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUVirSchema;
+import org.apache.syncope.persistence.jpa.entity.user.JPAUser;
+import org.springframework.stereotype.Component;
+
+@Component
+public class JPAEntityFactory implements EntityFactory {
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <KEY, T extends Entity<KEY>> T newEntity(final Class<T> reference) {
+        T result;
+
+        if (reference.equals(User.class)) {
+            result = (T) new JPAUser();
+        } else if (reference.equals(Role.class)) {
+            result = (T) new JPARole();
+        } else if (reference.equals(Membership.class)) {
+            result = (T) new JPAMembership();
+        } else if (reference.equals(Conf.class)) {
+            result = (T) new JPAConf();
+        } else if (reference.equals(Notification.class)) {
+            result = (T) new JPANotification();
+        } else if (reference.equals(Entitlement.class)) {
+            result = (T) new JPAEntitlement();
+        } else if (reference.equals(ExternalResource.class)) {
+            result = (T) new JPAExternalResource();
+        } else if (reference.equals(ConnInstance.class)) {
+            result = (T) new JPAConnInstance();
+        } else if (reference.equals(UPlainSchema.class)) {
+            result = (T) new JPAUPlainSchema();
+        } else if (reference.equals(UPlainAttr.class)) {
+            result = (T) new JPAUPlainAttr();
+        } else if (reference.equals(UPlainAttrValue.class)) {
+            result = (T) new JPAUPlainAttrValue();
+        } else if (reference.equals(UPlainAttrUniqueValue.class)) {
+            result = (T) new JPAUPlainAttrUniqueValue();
+        } else if (reference.equals(UDerSchema.class)) {
+            result = (T) new JPAUDerSchema();
+        } else if (reference.equals(UDerAttr.class)) {
+            result = (T) new JPAUDerAttr();
+        } else if (reference.equals(UVirSchema.class)) {
+            result = (T) new JPAUVirSchema();
+        } else if (reference.equals(UVirAttr.class)) {
+            result = (T) new JPAUVirAttr();
+        } else if (reference.equals(UMapping.class)) {
+            result = (T) new JPAUMapping();
+        } else if (reference.equals(UMappingItem.class)) {
+            result = (T) new JPAUMappingItem();
+        } else if (reference.equals(RPlainSchema.class)) {
+            result = (T) new JPARPlainSchema();
+        } else if (reference.equals(RPlainAttr.class)) {
+            result = (T) new JPARPlainAttr();
+        } else if (reference.equals(RPlainAttrValue.class)) {
+            result = (T) new JPARPlainAttrValue();
+        } else if (reference.equals(RPlainAttrUniqueValue.class)) {
+            result = (T) new JPARPlainAttrUniqueValue();
+        } else if (reference.equals(RPlainAttrTemplate.class)) {
+            result = (T) new JPARPlainAttrTemplate();
+        } else if (reference.equals(RDerAttrTemplate.class)) {
+            result = (T) new JPARDerAttrTemplate();
+        } else if (reference.equals(RVirAttrTemplate.class)) {
+            result = (T) new JPARVirAttrTemplate();
+        } else if (reference.equals(RDerSchema.class)) {
+            result = (T) new JPARDerSchema();
+        } else if (reference.equals(RDerAttr.class)) {
+            result = (T) new JPARDerAttr();
+        } else if (reference.equals(RVirSchema.class)) {
+            result = (T) new JPARVirSchema();
+        } else if (reference.equals(RVirAttr.class)) {
+            result = (T) new JPARVirAttr();
+        } else if (reference.equals(RMapping.class)) {
+            result = (T) new JPARMapping();
+        } else if (reference.equals(RMappingItem.class)) {
+            result = (T) new JPARMappingItem();
+        } else if (reference.equals(MPlainSchema.class)) {
+            result = (T) new JPAMPlainSchema();
+        } else if (reference.equals(MPlainAttr.class)) {
+            result = (T) new JPAMPlainAttr();
+        } else if (reference.equals(MPlainAttrValue.class)) {
+            result = (T) new JPAMPlainAttrValue();
+        } else if (reference.equals(MPlainAttrUniqueValue.class)) {
+            result = (T) new JPAMPlainAttrUniqueValue();
+        } else if (reference.equals(MDerSchema.class)) {
+            result = (T) new JPAMDerSchema();
+        } else if (reference.equals(MDerAttr.class)) {
+            result = (T) new JPAMDerAttr();
+        } else if (reference.equals(MVirSchema.class)) {
+            result = (T) new JPAMVirSchema();
+        } else if (reference.equals(MVirAttr.class)) {
+            result = (T) new JPAMVirAttr();
+        } else if (reference.equals(MPlainAttrTemplate.class)) {
+            result = (T) new JPAMPlainAttrTemplate();
+        } else if (reference.equals(MDerAttrTemplate.class)) {
+            result = (T) new JPAMDerAttrTemplate();
+        } else if (reference.equals(MVirAttrTemplate.class)) {
+            result = (T) new JPAMVirAttrTemplate();
+        } else if (reference.equals(CPlainSchema.class)) {
+            result = (T) new JPACPlainSchema();
+        } else if (reference.equals(CPlainAttr.class)) {
+            result = (T) new JPACPlainAttr();
+        } else if (reference.equals(CPlainAttrValue.class)) {
+            result = (T) new JPACPlainAttrValue();
+        } else if (reference.equals(CPlainAttrUniqueValue.class)) {
+            result = (T) new JPACPlainAttrUniqueValue();
+        } else if (reference.equals(Report.class)) {
+            result = (T) new JPAReport();
+        } else if (reference.equals(ReportExec.class)) {
+            result = (T) new JPAReportExec();
+        } else if (reference.equals(ReportletConfInstance.class)) {
+            result = (T) new JPAReportletConfInstance();
+        } else if (reference.equals(NotificationTask.class)) {
+            result = (T) new JPANotificationTask();
+        } else if (reference.equals(PropagationTask.class)) {
+            result = (T) new JPAPropagationTask();
+        } else if (reference.equals(PushTask.class)) {
+            result = (T) new JPAPushTask();
+        } else if (reference.equals(SyncTask.class)) {
+            result = (T) new JPASyncTask();
+        } else if (reference.equals(SchedTask.class)) {
+            result = (T) new JPASchedTask();
+        } else if (reference.equals(TaskExec.class)) {
+            result = (T) new JPATaskExec();
+        } else if (reference.equals(SecurityQuestion.class)) {
+            result = (T) new JPASecurityQuestion();
+        } else {
+            throw new IllegalArgumentException("Could not find a JPA implementation of " + reference.getName());
+        }
+
+        return result;
+    }
+
+    @Override
+    public <T extends Policy> T newPolicy(final Class<T> reference, final boolean global) {
+        T result;
+
+        if (reference.equals(AccountPolicy.class)) {
+            result = (T) new JPAAccountPolicy(global);
+        } else if (reference.equals(PasswordPolicy.class)) {
+            result = (T) new JPAPasswordPolicy(global);
+        } else if (reference.equals(PushPolicy.class)) {
+            result = (T) new JPAPushPolicy(global);
+        } else if (reference.equals(SyncPolicy.class)) {
+            result = (T) new JPASyncPolicy(global);
+        } else {
+            throw new IllegalArgumentException("Could not find a JPA implementation of " + reference.getName());
+        }
+
+        return result;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAPasswordPolicy.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAPasswordPolicy.java b/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAPasswordPolicy.java
index 1f0ee3a..b81e948 100644
--- a/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAPasswordPolicy.java
+++ b/syncope620/server/persistence-jpa/src/main/java/org/apache/syncope/persistence/jpa/entity/JPAPasswordPolicy.java
@@ -33,7 +33,7 @@ public class JPAPasswordPolicy extends JPAPolicy implements PasswordPolicy {
         this(false);
     }
 
-    public JPAPasswordPolicy(boolean global) {
+    public JPAPasswordPolicy(final boolean global) {
         super();
 
         this.type = global

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/AbstractTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/AbstractTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/AbstractTest.java
index b0fda7c..2c78453 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/AbstractTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/AbstractTest.java
@@ -18,11 +18,17 @@
  */
 package org.apache.syncope.persistence.jpa;
 
+import org.apache.syncope.persistence.api.entity.EntityFactory;
 import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations = { "classpath:persistenceTestEnv.xml" })
 public abstract class AbstractTest {
+
+    @Autowired
+    protected EntityFactory entityFactory;
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/AttrTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/AttrTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/AttrTest.java
index 7fa9642..f751b77 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/AttrTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/AttrTest.java
@@ -40,8 +40,6 @@ import org.apache.syncope.persistence.api.entity.user.UPlainAttrUniqueValue;
 import org.apache.syncope.persistence.api.entity.user.UPlainSchema;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUPlainAttr;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUPlainAttrUniqueValue;
 import org.apache.syncope.server.security.Encryptor;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -83,7 +81,7 @@ public class AttrTest extends AbstractTest {
         UPlainSchema emailSchema = userSchemaDAO.find("email", UPlainSchema.class);
         assertNotNull(emailSchema);
 
-        UPlainAttr attribute = new JPAUPlainAttr();
+        UPlainAttr attribute = entityFactory.newEntity(UPlainAttr.class);
         attribute.setSchema(emailSchema);
         attribute.setOwner(user);
 
@@ -113,7 +111,7 @@ public class AttrTest extends AbstractTest {
         assertNotNull(gender.getType());
         assertNotNull(gender.getEnumerationValues());
 
-        UPlainAttr attribute = new JPAUPlainAttr();
+        UPlainAttr attribute = entityFactory.newEntity(UPlainAttr.class);
         attribute.setSchema(gender);
         attribute.setOwner(user);
         user.addPlainAttr(attribute);
@@ -148,10 +146,10 @@ public class AttrTest extends AbstractTest {
         final UPlainSchema fullnameSchema = userSchemaDAO.find("fullname", UPlainSchema.class);
         assertNotNull(fullnameSchema);
 
-        UPlainAttr attribute = new JPAUPlainAttr();
+        UPlainAttr attribute = entityFactory.newEntity(UPlainAttr.class);
         attribute.setSchema(emailSchema);
 
-        UPlainAttrUniqueValue uauv = new JPAUPlainAttrUniqueValue();
+        UPlainAttrUniqueValue uauv = entityFactory.newEntity(UPlainAttrUniqueValue.class);
         uauv.setAttr(attribute);
         uauv.setSchema(fullnameSchema);
         uauv.setStringValue("a value");
@@ -183,7 +181,7 @@ public class AttrTest extends AbstractTest {
         assertNotNull(obscureSchema.getSecretKey());
         assertNotNull(obscureSchema.getCipherAlgorithm());
 
-        UPlainAttr attribute = new JPAUPlainAttr();
+        UPlainAttr attribute = entityFactory.newEntity(UPlainAttr.class);
         attribute.setSchema(obscureSchema);
         attribute.addValue("testvalue", JPAAttributableUtil.getInstance(AttributableType.USER));
         attribute.setOwner(user);
@@ -210,7 +208,7 @@ public class AttrTest extends AbstractTest {
         new Random().nextBytes(bytes);
         final String photoB64Value = new String(Base64.encode(bytes), SyncopeConstants.DEFAULT_ENCODING);
 
-        UPlainAttr attribute = new JPAUPlainAttr();
+        UPlainAttr attribute = entityFactory.newEntity(UPlainAttr.class);
         attribute.setSchema(photoSchema);
         attribute.addValue(photoB64Value, JPAAttributableUtil.getInstance(AttributableType.USER));
         attribute.setOwner(user);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConfTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConfTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConfTest.java
index 08d9919..ab662b7 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConfTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConfTest.java
@@ -33,8 +33,6 @@ import org.apache.syncope.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.persistence.api.entity.conf.CPlainAttr;
 import org.apache.syncope.persistence.api.entity.conf.CPlainSchema;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.conf.JPACPlainAttr;
-import org.apache.syncope.persistence.jpa.entity.conf.JPACPlainSchema;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -65,14 +63,14 @@ public class ConfTest extends AbstractTest {
     @Test
     public void setAndDelete() {
         // 1. create CSChema
-        CPlainSchema useless = new JPACPlainSchema();
+        CPlainSchema useless = entityFactory.newEntity(CPlainSchema.class);
         useless.setKey("useless");
         useless.setType(AttrSchemaType.Date);
         useless.setConversionPattern("yyyy-MM-dd");
         useless = plainSchemaDAO.save(useless);
 
         // 2. create conf
-        CPlainAttr newConf = new JPACPlainAttr();
+        CPlainAttr newConf = entityFactory.newEntity(CPlainAttr.class);
         newConf.setSchema(useless);
         newConf.addValue("2014-06-20", JPAAttributableUtil.getInstance(AttributableType.CONFIGURATION));
         confDAO.save(newConf);
@@ -96,7 +94,7 @@ public class ConfTest extends AbstractTest {
     @Test
     public void issueSYNCOPE418() {
         try {
-            CPlainSchema failing = new JPACPlainSchema();
+            CPlainSchema failing = entityFactory.newEntity(CPlainSchema.class);
             failing.setKey("http://schemas.examples.org/security/authorization/organizationUnit");
             failing.setType(AttrSchemaType.String);
             plainSchemaDAO.save(failing);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConnInstanceTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConnInstanceTest.java
index 95ce1a3..2395370 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConnInstanceTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ConnInstanceTest.java
@@ -64,7 +64,7 @@ public class ConnInstanceTest extends AbstractTest {
 
     @Test
     public void save() throws ClassNotFoundException {
-        ConnInstance connInstance = new JPAConnInstance();
+        ConnInstance connInstance = entityFactory.newEntity(ConnInstance.class);
 
         connInstance.setLocation(new File(System.getProperty("java.io.tmpdir")).toURI().toString());
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerAttrTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerAttrTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerAttrTest.java
index bd76f3c..8bc4468 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerAttrTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerAttrTest.java
@@ -45,14 +45,6 @@ import org.apache.syncope.persistence.api.entity.user.UDerSchema;
 import org.apache.syncope.persistence.api.entity.user.UPlainAttrValue;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMDerAttr;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMDerAttrTemplate;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMDerSchema;
-import org.apache.syncope.persistence.jpa.entity.role.JPARDerAttr;
-import org.apache.syncope.persistence.jpa.entity.role.JPARDerAttrTemplate;
-import org.apache.syncope.persistence.jpa.entity.role.JPARDerSchema;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUDerAttr;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUDerSchema;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -95,7 +87,7 @@ public class DerAttrTest extends AbstractTest {
         User owner = userDAO.find(3L);
         assertNotNull("did not get expected user", owner);
 
-        UDerAttr derAttr = new JPAUDerAttr();
+        UDerAttr derAttr = entityFactory.newEntity(UDerAttr.class);
         derAttr.setOwner(owner);
         derAttr.setSchema(cnSchema);
 
@@ -116,7 +108,7 @@ public class DerAttrTest extends AbstractTest {
         Membership owner = membershipDAO.find(1L);
         assertNotNull("did not get expected user", owner);
 
-        MDerAttr derAttr = new JPAMDerAttr();
+        MDerAttr derAttr = entityFactory.newEntity(MDerAttr.class);
         derAttr.setOwner(owner);
         derAttr.setTemplate(owner.getRole().getAttrTemplate(MDerAttrTemplate.class, "mderiveddata"));
 
@@ -138,7 +130,7 @@ public class DerAttrTest extends AbstractTest {
         Role owner = roleDAO.find(1L);
         assertNotNull("did not get expected user", owner);
 
-        RDerAttr derAttr = new JPARDerAttr();
+        RDerAttr derAttr = entityFactory.newEntity(RDerAttr.class);
         derAttr.setOwner(owner);
         derAttr.setTemplate(owner.getAttrTemplate(RDerAttrTemplate.class, "rderiveddata"));
 
@@ -171,7 +163,7 @@ public class DerAttrTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE134User() {
-        UDerSchema sderived = new JPAUDerSchema();
+        UDerSchema sderived = entityFactory.newEntity(UDerSchema.class);
         sderived.setKey("sderived");
         sderived.setExpression("status + ' - ' + username + ' - ' + creationDate + '[' + failedLogins + ']'");
 
@@ -185,7 +177,7 @@ public class DerAttrTest extends AbstractTest {
         User owner = userDAO.find(3L);
         assertNotNull("did not get expected user", owner);
 
-        UDerAttr derAttr = new JPAUDerAttr();
+        UDerAttr derAttr = entityFactory.newEntity(UDerAttr.class);
         derAttr.setOwner(owner);
         derAttr.setSchema(sderived);
 
@@ -204,7 +196,7 @@ public class DerAttrTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE134Role() {
-        RDerSchema sderived = new JPARDerSchema();
+        RDerSchema sderived = entityFactory.newEntity(RDerSchema.class);
         sderived.setKey("sderived");
         sderived.setExpression("name");
 
@@ -218,11 +210,11 @@ public class DerAttrTest extends AbstractTest {
         Role owner = roleDAO.find(7L);
         assertNotNull("did not get expected role", owner);
 
-        RDerAttrTemplate template = new JPARDerAttrTemplate();
+        RDerAttrTemplate template = entityFactory.newEntity(RDerAttrTemplate.class);
         template.setSchema(sderived);
         owner.getAttrTemplates(RDerAttrTemplate.class).add(template);
 
-        RDerAttr derAttr = new JPARDerAttr();
+        RDerAttr derAttr = entityFactory.newEntity(RDerAttr.class);
         derAttr.setOwner(owner);
         derAttr.setTemplate(owner.getAttrTemplate(RDerAttrTemplate.class, sderived.getKey()));
 
@@ -241,7 +233,7 @@ public class DerAttrTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE134Memb() {
-        MDerSchema mderived = new JPAMDerSchema();
+        MDerSchema mderived = entityFactory.newEntity(MDerSchema.class);
         mderived.setKey("mderived");
         mderived.setExpression("key");
 
@@ -255,13 +247,13 @@ public class DerAttrTest extends AbstractTest {
         Membership owner = membershipDAO.find(4L);
         assertNotNull("did not get expected membership", owner);
 
-        MDerAttrTemplate template = new JPAMDerAttrTemplate();
+        MDerAttrTemplate template = entityFactory.newEntity(MDerAttrTemplate.class);
         template.setSchema(mderived);
         owner.getRole().getAttrTemplates(MDerAttrTemplate.class).add(template);
 
         derSchemaDAO.flush();
 
-        MDerAttr derAttr = new JPAMDerAttr();
+        MDerAttr derAttr = entityFactory.newEntity(MDerAttr.class);
         derAttr.setOwner(owner);
         derAttr.setTemplate(owner.getRole().getAttrTemplate(MDerAttrTemplate.class, mderived.getKey()));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerSchemaTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerSchemaTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerSchemaTest.java
index 0898114..19af5e9 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerSchemaTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/DerSchemaTest.java
@@ -33,7 +33,6 @@ import org.apache.syncope.persistence.api.entity.DerSchema;
 import org.apache.syncope.persistence.api.entity.role.RDerSchema;
 import org.apache.syncope.persistence.api.entity.user.UDerSchema;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUDerSchema;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -58,7 +57,7 @@ public class DerSchemaTest extends AbstractTest {
 
     @Test
     public void save() {
-        UDerSchema derivedAttributeSchema = new JPAUDerSchema();
+        UDerSchema derivedAttributeSchema = entityFactory.newEntity(UDerSchema.class);
         derivedAttributeSchema.setKey("cn2");
         derivedAttributeSchema.setExpression("firstname surname");
 
@@ -91,7 +90,7 @@ public class DerSchemaTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE418() {
-        UDerSchema schema = new JPAUDerSchema();
+        UDerSchema schema = entityFactory.newEntity(UDerSchema.class);
         schema.setKey("http://schemas.examples.org/security/authorization/organizationUnit");
 
         try {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/EntitlementTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/EntitlementTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/EntitlementTest.java
index be13431..9d4746b 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/EntitlementTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/EntitlementTest.java
@@ -50,7 +50,7 @@ public class EntitlementTest extends AbstractTest {
 
     @Test
     public void save() {
-        Entitlement entitlement = new JPAEntitlement();
+        Entitlement entitlement = entityFactory.newEntity(Entitlement.class);
         entitlement.setKey("another");
 
         entitlementDAO.save(entitlement);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/MembershipTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/MembershipTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/MembershipTest.java
index 53c6e6f..b83c453 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/MembershipTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/MembershipTest.java
@@ -30,7 +30,6 @@ import org.apache.syncope.persistence.api.entity.membership.Membership;
 import org.apache.syncope.persistence.api.entity.role.Role;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMembership;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -64,7 +63,7 @@ public class MembershipTest extends AbstractTest {
         User user = userDAO.find(4L);
         Role role = roleDAO.find(1L);
 
-        Membership membership = new JPAMembership();
+        Membership membership = entityFactory.newEntity(Membership.class);
         membership.setUser(user);
         membership.setRole(role);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/NotificationTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/NotificationTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/NotificationTest.java
index 859b63a..cd4b116 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/NotificationTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/NotificationTest.java
@@ -57,7 +57,7 @@ public class NotificationTest extends AbstractTest {
 
     @Test
     public void save() {
-        Notification notification = new JPANotification();
+        Notification notification = entityFactory.newEntity(Notification.class);
         notification.addEvent("save");
 
         notification.setUserAbout("fake search condition");
@@ -84,7 +84,7 @@ public class NotificationTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE445() {
-        Notification notification = new JPANotification();
+        Notification notification = entityFactory.newEntity(Notification.class);
         notification.addEvent("save");
 
         notification.setUserAbout("fake search condition");
@@ -109,7 +109,7 @@ public class NotificationTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE446() {
-        Notification notification = new JPANotification();
+        Notification notification = entityFactory.newEntity(Notification.class);
         notification.addEvent("[REST]:[RoleController]:[]:[create]:[SUCCESS]");
 
         notification.setRoleAbout("fake search condition");

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PlainSchemaTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PlainSchemaTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PlainSchemaTest.java
index 50d2ae9..4e47087 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PlainSchemaTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PlainSchemaTest.java
@@ -36,8 +36,6 @@ import org.apache.syncope.persistence.api.entity.role.RPlainAttr;
 import org.apache.syncope.persistence.api.entity.role.RPlainSchema;
 import org.apache.syncope.persistence.api.entity.user.UPlainSchema;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.role.JPARPlainSchema;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUPlainSchema;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -78,7 +76,7 @@ public class PlainSchemaTest extends AbstractTest {
 
     @Test
     public void save() {
-        UPlainSchema schema = new JPAUPlainSchema();
+        UPlainSchema schema = entityFactory.newEntity(UPlainSchema.class);
         schema.setKey("secondaryEmail");
         schema.setType(AttrSchemaType.String);
         schema.setValidatorClass("org.apache.syncope.core.validation.EmailAddressValidator");
@@ -94,7 +92,7 @@ public class PlainSchemaTest extends AbstractTest {
 
     @Test(expected = InvalidEntityException.class)
     public void saveNonValid() {
-        UPlainSchema schema = new JPAUPlainSchema();
+        UPlainSchema schema = entityFactory.newEntity(UPlainSchema.class);
         schema.setKey("secondaryEmail");
         schema.setType(AttrSchemaType.String);
         schema.setValidatorClass("org.apache.syncope.core.validation.EmailAddressValidator");
@@ -107,7 +105,7 @@ public class PlainSchemaTest extends AbstractTest {
 
     @Test
     public void checkForEnumType() {
-        RPlainSchema schema = new JPARPlainSchema();
+        RPlainSchema schema = entityFactory.newEntity(RPlainSchema.class);
         schema.setType(AttrSchemaType.Enum);
         schema.setKey("color");
 
@@ -132,7 +130,7 @@ public class PlainSchemaTest extends AbstractTest {
 
     @Test(expected = InvalidEntityException.class)
     public void saveInvalidSchema() {
-        UPlainSchema schema = new JPAUPlainSchema();
+        UPlainSchema schema = entityFactory.newEntity(UPlainSchema.class);
         schema.setKey("username");
         plainSchemaDAO.save(schema);
     }
@@ -149,7 +147,7 @@ public class PlainSchemaTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE418() {
-        UPlainSchema schema = new JPAUPlainSchema();
+        UPlainSchema schema = entityFactory.newEntity(UPlainSchema.class);
         schema.setKey("http://schemas.examples.org/security/authorization/organizationUnit");
 
         try {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PolicyTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PolicyTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PolicyTest.java
index 38c97a6..8c1d65a 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PolicyTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/PolicyTest.java
@@ -79,7 +79,7 @@ public class PolicyTest extends AbstractTest {
         passwordPolicy.setMaxLength(8);
         passwordPolicy.setMinLength(6);
 
-        SyncPolicy policy = new JPASyncPolicy();
+        SyncPolicy policy = entityFactory.newPolicy(SyncPolicy.class, false);
         policy.setSpecification(passwordPolicy);
         policy.setDescription("sync policy");
 
@@ -92,7 +92,7 @@ public class PolicyTest extends AbstractTest {
         passwordPolicy.setMaxLength(8);
         passwordPolicy.setMinLength(6);
 
-        PasswordPolicy policy = new JPAPasswordPolicy(true);
+        PasswordPolicy policy = entityFactory.newPolicy(PasswordPolicy.class, true);
         policy.setSpecification(passwordPolicy);
         policy.setDescription("global password policy");
 
@@ -101,7 +101,7 @@ public class PolicyTest extends AbstractTest {
 
     @Test
     public void create() {
-        SyncPolicy policy = new JPASyncPolicy();
+        SyncPolicy policy = entityFactory.newPolicy(SyncPolicy.class, false);
 
         final String syncURuleName = "net.tirasa.sync.correlation.TirasaURule";
         final String syncRRuleName = "net.tirasa.sync.correlation.TirasaRRule";

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ReportTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ReportTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ReportTest.java
index 0b97138..e469f5c 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ReportTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ReportTest.java
@@ -57,7 +57,7 @@ public class ReportTest extends AbstractTest {
     public void save() {
         int beforeCount = reportDAO.count();
 
-        Report report = new JPAReport();
+        Report report = entityFactory.newEntity(Report.class);
         report.setName("new report");
         report.addReportletConf(new UserReportletConf("first"));
         report.addReportletConf(new UserReportletConf("second"));

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ResourceTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ResourceTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ResourceTest.java
index bc51e2c..a82c450 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ResourceTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/ResourceTest.java
@@ -38,8 +38,6 @@ import org.apache.syncope.persistence.api.entity.ExternalResource;
 import org.apache.syncope.persistence.api.entity.user.UMapping;
 import org.apache.syncope.persistence.api.entity.user.UMappingItem;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUMapping;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUMappingItem;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -93,15 +91,15 @@ public class ResourceTest extends AbstractTest {
 
     @Test
     public void save() {
-        ExternalResource resource = new JPAExternalResource();
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
         resource.setKey("ws-target-resource-basic-save");
         resource.setPropagationPriority(2);
         resource.setPropagationPrimary(true);
 
-        UMapping mapping = new JPAUMapping();
+        UMapping mapping = entityFactory.newEntity(UMapping.class);
         resource.setUmapping(mapping);
 
-        UMappingItem accountId = new JPAUMappingItem();
+        UMappingItem accountId = entityFactory.newEntity(UMappingItem.class);
         accountId.setExtAttrName("username");
         accountId.setIntAttrName("fullname");
         accountId.setIntMappingType(IntMappingType.UserId);
@@ -124,16 +122,16 @@ public class ResourceTest extends AbstractTest {
 
     @Test(expected = InvalidEntityException.class)
     public void saveInvalidMappingIntAttr() {
-        ExternalResource resource = new JPAExternalResource();
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
         resource.setKey("ws-target-resource-basic-save-invalid");
 
         ConnInstance connector = resourceDAO.find("ws-target-resource-1").getConnector();
         resource.setConnector(connector);
 
-        UMapping mapping = new JPAUMapping();
+        UMapping mapping = entityFactory.newEntity(UMapping.class);
         resource.setUmapping(mapping);
 
-        UMappingItem accountId = new JPAUMappingItem();
+        UMappingItem accountId = entityFactory.newEntity(UMappingItem.class);
         accountId.setAccountid(true);
         accountId.setIntMappingType(IntMappingType.UserSchema);
         mapping.addItem(accountId);
@@ -145,16 +143,16 @@ public class ResourceTest extends AbstractTest {
 
     @Test(expected = IllegalArgumentException.class)
     public void saveInvalidAccountIdMapping() {
-        ExternalResource resource = new JPAExternalResource();
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
         resource.setKey("ws-target-resource-basic-save-invalid");
 
         ConnInstance connector = resourceDAO.find("ws-target-resource-1").getConnector();
         resource.setConnector(connector);
 
-        UMapping mapping = new JPAUMapping();
+        UMapping mapping = entityFactory.newEntity(UMapping.class);
         resource.setUmapping(mapping);
 
-        UMappingItem accountId = new JPAUMappingItem();
+        UMappingItem accountId = entityFactory.newEntity(UMappingItem.class);
         accountId.setAccountid(true);
         accountId.setIntMappingType(IntMappingType.UserVirtualSchema);
         mapping.setAccountIdItem(accountId);
@@ -166,22 +164,22 @@ public class ResourceTest extends AbstractTest {
 
     @Test(expected = InvalidEntityException.class)
     public void saveInvalidMappingExtAttr() {
-        ExternalResource resource = new JPAExternalResource();
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
         resource.setKey("ws-target-resource-basic-save-invalid");
 
         ConnInstance connector = resourceDAO.find("ws-target-resource-1").getConnector();
         resource.setConnector(connector);
 
-        UMapping mapping = new JPAUMapping();
+        UMapping mapping = entityFactory.newEntity(UMapping.class);
         resource.setUmapping(mapping);
 
-        UMappingItem item = new JPAUMappingItem();
+        UMappingItem item = entityFactory.newEntity(UMappingItem.class);
         item.setAccountid(true);
         item.setIntAttrName("fullname");
         item.setIntMappingType(IntMappingType.UserSchema);
         mapping.addItem(item);
 
-        item = new JPAUMappingItem();
+        item = entityFactory.newEntity(UMappingItem.class);
         item.setIntAttrName("userId");
         item.setIntMappingType(IntMappingType.UserSchema);
         mapping.addItem(item);
@@ -192,30 +190,30 @@ public class ResourceTest extends AbstractTest {
 
     @Test
     public void saveWithRoleMappingType() {
-        ExternalResource resource = new JPAExternalResource();
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
         resource.setKey("ws-target-resource-basic-save-invalid");
 
         ConnInstance connector = resourceDAO.find("ws-target-resource-1").getConnector();
         resource.setConnector(connector);
 
-        UMapping mapping = new JPAUMapping();
+        UMapping mapping = entityFactory.newEntity(UMapping.class);
         resource.setUmapping(mapping);
 
-        UMappingItem item = new JPAUMappingItem();
+        UMappingItem item = entityFactory.newEntity(UMappingItem.class);
         item.setIntAttrName("fullname");
         item.setExtAttrName("fullname");
         item.setIntMappingType(IntMappingType.UserSchema);
         item.setPurpose(MappingPurpose.BOTH);
         mapping.setAccountIdItem(item);
 
-        item = new JPAUMappingItem();
+        item = entityFactory.newEntity(UMappingItem.class);
         item.setIntAttrName("icon");
         item.setExtAttrName("icon");
         item.setIntMappingType(IntMappingType.RoleSchema);
         item.setPurpose(MappingPurpose.BOTH);
         mapping.addItem(item);
 
-        item = new JPAUMappingItem();
+        item = entityFactory.newEntity(UMappingItem.class);
         item.setIntAttrName("mderiveddata");
         item.setExtAttrName("mderiveddata");
         item.setIntMappingType(IntMappingType.MembershipDerivedSchema);
@@ -255,7 +253,7 @@ public class ResourceTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE418() {
-        ExternalResource resource = new JPAExternalResource();
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
         resource.setKey("http://schemas.examples.org/security/authorization/organizationUnit");
 
         try {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/RoleTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/RoleTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/RoleTest.java
index da5256f..b2cc641 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/RoleTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/RoleTest.java
@@ -29,7 +29,6 @@ import org.apache.syncope.persistence.api.entity.AccountPolicy;
 import org.apache.syncope.persistence.api.entity.PasswordPolicy;
 import org.apache.syncope.persistence.api.entity.role.Role;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.role.JPARole;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -104,7 +103,7 @@ public class RoleTest extends AbstractTest {
 
     @Test
     public void save() {
-        Role role = new JPARole();
+        Role role = entityFactory.newEntity(Role.class);
         role.setName("secondChild");
 
         // verify inheritance password and account policies

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/SecurityQuestionTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/SecurityQuestionTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/SecurityQuestionTest.java
index 61b210f..5c74bd3 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/SecurityQuestionTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/SecurityQuestionTest.java
@@ -52,7 +52,7 @@ public class SecurityQuestionTest extends AbstractTest {
 
     @Test
     public void save() {
-        SecurityQuestion securityQuestion = new JPASecurityQuestion();
+        SecurityQuestion securityQuestion = entityFactory.newEntity(SecurityQuestion.class);
         securityQuestion.setContent("What is your favorite pet's name?");
 
         SecurityQuestion actual = securityQuestionDAO.save(securityQuestion);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskExecTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskExecTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskExecTest.java
index bbf4123..f3df4e2 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskExecTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskExecTest.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.persistence.jpa.entity;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
@@ -32,7 +31,6 @@ import org.apache.syncope.persistence.api.dao.TaskExecDAO;
 import org.apache.syncope.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.persistence.api.entity.task.TaskExec;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.task.JPATaskExec;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -79,7 +77,7 @@ public class TaskExecTest extends AbstractTest {
         String faultyMessage = "A faulty message";
         faultyMessage = faultyMessage.replace('a', '\0');
 
-        TaskExec exec = new JPATaskExec();
+        TaskExec exec = entityFactory.newEntity(TaskExec.class);
         exec.setStartDate(new Date());
         exec.setEndDate(new Date());
         exec.setStatus(PropagationTaskExecStatus.SUCCESS.name());

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskTest.java
index 3154b35..75777aa 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/TaskTest.java
@@ -37,7 +37,6 @@ import org.apache.syncope.persistence.api.entity.ExternalResource;
 import org.apache.syncope.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.task.JPAPropagationTask;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.AttributeBuilder;
 import org.junit.Test;
@@ -80,7 +79,7 @@ public class TaskTest extends AbstractTest {
         User user = userDAO.find(2L);
         assertNotNull(user);
 
-        PropagationTask task = new JPAPropagationTask();
+        PropagationTask task = entityFactory.newEntity(PropagationTask.class);
         task.setResource(resource);
         task.setSubjectType(AttributableType.USER);
         task.setPropagationMode(PropagationMode.TWO_PHASES);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/UserTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/UserTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/UserTest.java
index cda790a..5ae3b06 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/UserTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/UserTest.java
@@ -33,8 +33,6 @@ import org.apache.syncope.persistence.api.dao.UserDAO;
 import org.apache.syncope.persistence.api.entity.user.UPlainAttrValue;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUPlainAttrValue;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUser;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -100,7 +98,7 @@ public class UserTest extends AbstractTest {
 
     @Test
     public void findByAttributeValue() {
-        final UPlainAttrValue fullnameValue = new JPAUPlainAttrValue();
+        final UPlainAttrValue fullnameValue = entityFactory.newEntity(UPlainAttrValue.class);
         fullnameValue.setStringValue("Gioacchino Rossini");
 
         final List<User> list = userDAO.findByAttrValue("fullname", fullnameValue);
@@ -109,7 +107,7 @@ public class UserTest extends AbstractTest {
 
     @Test
     public void findByAttributeBooleanValue() {
-        final UPlainAttrValue coolValue = new JPAUPlainAttrValue();
+        final UPlainAttrValue coolValue = entityFactory.newEntity(UPlainAttrValue.class);
         coolValue.setBooleanValue(true);
 
         final List<User> list = userDAO.findByAttrValue("cool", coolValue);
@@ -138,7 +136,7 @@ public class UserTest extends AbstractTest {
 
     @Test
     public void save() {
-        User user = new JPAUser();
+        User user = entityFactory.newEntity(User.class);
         user.setUsername("username");
         user.setCreationDate(new Date());
 
@@ -183,7 +181,7 @@ public class UserTest extends AbstractTest {
 
     @Test
     public void issue237() {
-        User user = new JPAUser();
+        User user = entityFactory.newEntity(User.class);
         user.setUsername("username");
         user.setCreationDate(new Date());
 
@@ -195,7 +193,7 @@ public class UserTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE391() {
-        User user = new JPAUser();
+        User user = entityFactory.newEntity(User.class);
         user.setUsername("username");
         user.setPassword(null, CipherAlgorithm.AES);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirAttrTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirAttrTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirAttrTest.java
index 07cd61a..c63bf72 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirAttrTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirAttrTest.java
@@ -38,9 +38,6 @@ import org.apache.syncope.persistence.api.entity.user.UVirAttr;
 import org.apache.syncope.persistence.api.entity.user.UVirSchema;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMVirAttr;
-import org.apache.syncope.persistence.jpa.entity.role.JPARVirAttr;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUVirAttr;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -83,7 +80,7 @@ public class VirAttrTest extends AbstractTest {
         User owner = userDAO.find(3L);
         assertNotNull("did not get expected user", owner);
 
-        UVirAttr virAttr = new JPAUVirAttr();
+        UVirAttr virAttr = entityFactory.newEntity(UVirAttr.class);
         virAttr.setOwner(owner);
         virAttr.setSchema(virSchema);
 
@@ -99,7 +96,7 @@ public class VirAttrTest extends AbstractTest {
         Membership owner = membershipDAO.find(3L);
         assertNotNull("did not get expected membership", owner);
 
-        MVirAttr virAttr = new JPAMVirAttr();
+        MVirAttr virAttr = entityFactory.newEntity(MVirAttr.class);
         virAttr.setOwner(owner);
         virAttr.setTemplate(owner.getRole().getAttrTemplate(MVirAttrTemplate.class, "mvirtualdata"));
 
@@ -116,7 +113,7 @@ public class VirAttrTest extends AbstractTest {
         Role owner = roleDAO.find(3L);
         assertNotNull("did not get expected membership", owner);
 
-        RVirAttr virAttr = new JPARVirAttr();
+        RVirAttr virAttr = entityFactory.newEntity(RVirAttr.class);
         virAttr.setOwner(owner);
         virAttr.setTemplate(owner.getAttrTemplate(RVirAttrTemplate.class, "rvirtualdata"));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirSchemaTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirSchemaTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirSchemaTest.java
index 4cf9be8..9ae9e48 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirSchemaTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/entity/VirSchemaTest.java
@@ -33,7 +33,6 @@ import org.apache.syncope.persistence.api.entity.VirSchema;
 import org.apache.syncope.persistence.api.entity.role.RVirSchema;
 import org.apache.syncope.persistence.api.entity.user.UVirSchema;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUVirSchema;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -58,7 +57,7 @@ public class VirSchemaTest extends AbstractTest {
 
     @Test
     public void save() {
-        UVirSchema virtualAttributeSchema = new JPAUVirSchema();
+        UVirSchema virtualAttributeSchema = entityFactory.newEntity(UVirSchema.class);
         virtualAttributeSchema.setKey("virtual");
         virtualAttributeSchema.setReadonly(true);
 
@@ -90,7 +89,7 @@ public class VirSchemaTest extends AbstractTest {
 
     @Test
     public void issueSYNCOPE418() {
-        UVirSchema schema = new JPAUVirSchema();
+        UVirSchema schema = entityFactory.newEntity(UVirSchema.class);
         schema.setKey("http://schemas.examples.org/security/authorization/organizationUnit");
 
         try {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/AttrTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/AttrTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/AttrTest.java
index c1fd3c9..1074726 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/AttrTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/AttrTest.java
@@ -48,11 +48,6 @@ import org.apache.syncope.persistence.api.entity.user.UPlainAttrValue;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
 import org.apache.syncope.persistence.jpa.entity.JPAAttributableUtil;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMPlainAttr;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMPlainAttrTemplate;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMPlainSchema;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUDerAttr;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUDerSchema;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -115,7 +110,7 @@ public class AttrTest extends AbstractTest {
         Membership membership = user.getMembership(1L);
         assertNotNull(membership);
 
-        MPlainSchema schema = new JPAMPlainSchema();
+        MPlainSchema schema = entityFactory.newEntity(MPlainSchema.class);
         schema.setType(AttrSchemaType.Enum);
         schema.setKey("color");
         schema.setEnumerationValues("red" + SyncopeConstants.ENUM_VALUES_SEPARATOR + "yellow");
@@ -123,11 +118,11 @@ public class AttrTest extends AbstractTest {
         MPlainSchema actualSchema = plainSchemaDAO.save(schema);
         assertNotNull(actualSchema);
 
-        MPlainAttrTemplate template = new JPAMPlainAttrTemplate();
+        MPlainAttrTemplate template = entityFactory.newEntity(MPlainAttrTemplate.class);
         template.setSchema(actualSchema);
         membership.getRole().getAttrTemplates(MPlainAttrTemplate.class).add(template);
 
-        MPlainAttr attr = new JPAMPlainAttr();
+        MPlainAttr attr = entityFactory.newEntity(MPlainAttr.class);
         attr.setTemplate(template);
         attr.setOwner(membership);
         attr.addValue("yellow", JPAAttributableUtil.getInstance(AttributableType.MEMBERSHIP));
@@ -146,7 +141,7 @@ public class AttrTest extends AbstractTest {
 
     @Test
     public void derAttrFromSpecialAttrs() {
-        UDerSchema sderived = new JPAUDerSchema();
+        UDerSchema sderived = entityFactory.newEntity(UDerSchema.class);
         sderived.setKey("sderived");
         sderived.setExpression("username + ' - ' + creationDate + '[' + failedLogins + ']'");
 
@@ -160,7 +155,7 @@ public class AttrTest extends AbstractTest {
         User owner = userDAO.find(3L);
         assertNotNull("did not get expected user", owner);
 
-        UDerAttr derAttr = new JPAUDerAttr();
+        UDerAttr derAttr = entityFactory.newEntity(UDerAttr.class);
         derAttr.setOwner(owner);
         derAttr.setSchema(sderived);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/MembershipTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/MembershipTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/MembershipTest.java
index 77d77c0..c391aaa 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/MembershipTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/MembershipTest.java
@@ -26,13 +26,10 @@ import org.apache.syncope.persistence.api.entity.membership.Membership;
 import org.apache.syncope.persistence.api.entity.role.Role;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.membership.JPAMembership;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-
-
 @Transactional
 public class MembershipTest extends AbstractTest {
 
@@ -75,7 +72,7 @@ public class MembershipTest extends AbstractTest {
 
         // 2. (in the same transaction) create new membership with same user
         // and role (in order to check the UNIQE constraint on Membership)
-        membership = new JPAMembership();
+        membership = entityFactory.newEntity(Membership.class);
         membership.setUser(user);
         membership.setRole(role);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ReportTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ReportTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ReportTest.java
index 55481cd..1623a99 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ReportTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ReportTest.java
@@ -31,8 +31,6 @@ import org.apache.syncope.persistence.api.dao.ReportExecDAO;
 import org.apache.syncope.persistence.api.entity.Report;
 import org.apache.syncope.persistence.api.entity.ReportExec;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.JPAReport;
-import org.apache.syncope.persistence.jpa.entity.JPAReportExec;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -63,7 +61,7 @@ public class ReportTest extends AbstractTest {
 
         String name = report.getName();
 
-        report = new JPAReport();
+        report = entityFactory.newEntity(Report.class);
         report.setName(name);
 
         reportDAO.save(report);
@@ -76,7 +74,7 @@ public class ReportTest extends AbstractTest {
         assertNotNull(report);
         assertEquals(1, report.getExecs().size());
 
-        ReportExec reportExec = new JPAReportExec();
+        ReportExec reportExec = entityFactory.newEntity(ReportExec.class);
         reportExec.setReport(report);
         reportExec.setStartDate(new Date());
         reportExec.setEndDate(new Date());

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ResourceTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ResourceTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ResourceTest.java
index a78aeee..6a5595c 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ResourceTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/ResourceTest.java
@@ -46,10 +46,7 @@ import org.apache.syncope.persistence.api.entity.user.UMapping;
 import org.apache.syncope.persistence.api.entity.user.UMappingItem;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.JPAExternalResource;
 import org.apache.syncope.persistence.jpa.entity.role.JPARMappingItem;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUMapping;
-import org.apache.syncope.persistence.jpa.entity.user.JPAUMappingItem;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -80,7 +77,7 @@ public class ResourceTest extends AbstractTest {
         final String resourceName = "resourceWithPasswordPolicy";
 
         PasswordPolicy policy = (PasswordPolicy) policyDAO.find(4L);
-        ExternalResource resource = new JPAExternalResource();
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
         resource.setKey(resourceName);
         resource.setPasswordPolicy(policy);
 
@@ -103,7 +100,7 @@ public class ResourceTest extends AbstractTest {
 
     @Test
     public void save() {
-        ExternalResource resource = new JPAExternalResource();
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
         resource.setKey("ws-target-resource-save");
 
         // specify the connector
@@ -112,13 +109,13 @@ public class ResourceTest extends AbstractTest {
 
         resource.setConnector(connector);
 
-        UMapping mapping = new JPAUMapping();
+        UMapping mapping = entityFactory.newEntity(UMapping.class);
         mapping.setResource(resource);
         resource.setUmapping(mapping);
 
         // specify mappings
         for (int i = 0; i < 3; i++) {
-            UMappingItem item = new JPAUMappingItem();
+            UMappingItem item = entityFactory.newEntity(UMappingItem.class);
             item.setExtAttrName("test" + i);
             item.setIntAttrName("nonexistent" + i);
             item.setIntMappingType(IntMappingType.UserSchema);
@@ -127,7 +124,7 @@ public class ResourceTest extends AbstractTest {
             mapping.addItem(item);
             item.setMapping(mapping);
         }
-        UMappingItem accountId = new JPAUMappingItem();
+        UMappingItem accountId = entityFactory.newEntity(UMappingItem.class);
         accountId.setExtAttrName("username");
         accountId.setIntAttrName("username");
         accountId.setIntMappingType(IntMappingType.UserId);
@@ -136,7 +133,7 @@ public class ResourceTest extends AbstractTest {
         accountId.setMapping(mapping);
 
         // map a derived attribute
-        UMappingItem derived = new JPAUMappingItem();
+        UMappingItem derived = entityFactory.newEntity(UMappingItem.class);
         derived.setAccountid(false);
         derived.setExtAttrName("fullname");
         derived.setIntAttrName("cn");
@@ -282,7 +279,7 @@ public class ResourceTest extends AbstractTest {
 
         int origMapItems = csv.getUmapping().getItems().size();
 
-        UMappingItem newMapItem = new JPAUMappingItem();
+        UMappingItem newMapItem = entityFactory.newEntity(UMappingItem.class);
         newMapItem.setIntMappingType(IntMappingType.Username);
         newMapItem.setExtAttrName("TEST");
         newMapItem.setPurpose(MappingPurpose.PROPAGATION);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/RoleTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/RoleTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/RoleTest.java
index 5ae1ff5..9eddc6e 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/RoleTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/RoleTest.java
@@ -40,7 +40,6 @@ import org.apache.syncope.persistence.api.entity.role.RPlainSchema;
 import org.apache.syncope.persistence.api.entity.role.Role;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.role.JPARole;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -77,7 +76,7 @@ public class RoleTest extends AbstractTest {
         User user = userDAO.find(1L);
         assertNotNull("did not find expected user", user);
 
-        Role role = new JPARole();
+        Role role = entityFactory.newEntity(Role.class);
         role.setName("error");
         role.setUserOwner(user);
         role.setRoleOwner(root);
@@ -113,7 +112,7 @@ public class RoleTest extends AbstractTest {
 
     public void createWithPasswordPolicy() {
         PasswordPolicy policy = (PasswordPolicy) policyDAO.find(4L);
-        Role role = new JPARole();
+        Role role = entityFactory.newEntity(Role.class);
         role.setName("roleWithPasswordPolicy");
         role.setPasswordPolicy(policy);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f6938ea9/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/TaskTest.java
----------------------------------------------------------------------
diff --git a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/TaskTest.java b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/TaskTest.java
index f571f7d..27ffb1e 100644
--- a/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/TaskTest.java
+++ b/syncope620/server/persistence-jpa/src/test/java/org/apache/syncope/persistence/jpa/relationship/TaskTest.java
@@ -43,8 +43,6 @@ import org.apache.syncope.persistence.api.entity.task.SyncTask;
 import org.apache.syncope.persistence.api.entity.task.TaskExec;
 import org.apache.syncope.persistence.api.entity.user.User;
 import org.apache.syncope.persistence.jpa.AbstractTest;
-import org.apache.syncope.persistence.jpa.entity.task.JPAPropagationTask;
-import org.apache.syncope.persistence.jpa.entity.task.JPATaskExec;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.AttributeBuilder;
 import org.junit.Test;
@@ -84,7 +82,7 @@ public class TaskTest extends AbstractTest {
         User user = userDAO.find(2L);
         assertNotNull(user);
 
-        PropagationTask task = new JPAPropagationTask();
+        PropagationTask task = entityFactory.newEntity(PropagationTask.class);
         task.setResource(resource);
         task.setSubjectType(AttributableType.USER);
         task.setPropagationMode(PropagationMode.TWO_PHASES);
@@ -115,7 +113,7 @@ public class TaskTest extends AbstractTest {
 
         int executionNumber = task.getExecs().size();
 
-        TaskExec execution = new JPATaskExec();
+        TaskExec execution = entityFactory.newEntity(TaskExec.class);
         execution.setTask(task);
         execution.setStatus(PropagationTaskExecStatus.CREATED.name());
         task.addExec(execution);
@@ -137,7 +135,7 @@ public class TaskTest extends AbstractTest {
 
         int executionNumber = task.getExecs().size();
 
-        TaskExec execution = new JPATaskExec();
+        TaskExec execution = entityFactory.newEntity(TaskExec.class);
         execution.setStatus("Text-free status");
         execution.setTask(task);
         task.addExec(execution);
@@ -159,7 +157,7 @@ public class TaskTest extends AbstractTest {
 
         int executionNumber = task.getExecs().size();
 
-        TaskExec execution = new JPATaskExec();
+        TaskExec execution = entityFactory.newEntity(TaskExec.class);
         execution.setStatus("Text-free status");
         execution.setTask(task);
         task.addExec(execution);