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 2022/11/23 10:49:43 UTC

[syncope] branch master updated: Consolidating labels into SyncopeSchema to save some joins (#394)

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new 587d300474 Consolidating labels into SyncopeSchema to save some joins (#394)
587d300474 is described below

commit 587d3004746f761c18616d3f01f71cdd3186ce23
Author: Francesco Chicchiriccò <il...@users.noreply.github.com>
AuthorDate: Wed Nov 23 11:49:38 2022 +0100

    Consolidating labels into SyncopeSchema to save some joins (#394)
---
 .../syncope/common/lib/policy/AccessPolicyTO.java  |  3 +-
 .../common/lib/policy/AttrReleasePolicyTO.java     |  3 +-
 .../syncope/common/lib/policy/AuthPolicyTO.java    |  3 +-
 .../syncope/common/lib/to/CASSPClientAppTO.java    | 17 ++---
 .../apache/syncope/common/lib/to/ClientAppTO.java  |  2 +-
 .../syncope/common/lib/to/OIDCRPClientAppTO.java   |  3 +-
 .../syncope/common/lib/to/SAML2SPClientAppTO.java  |  3 +-
 .../common/lib/policy/PropagationPolicyTO.java     |  3 +-
 .../common/lib/policy/ProvisioningPolicyTO.java    |  3 +-
 .../syncope/common/lib/policy/PullPolicyTO.java    |  3 +-
 .../syncope/common/lib/policy/PushPolicyTO.java    |  3 +-
 .../syncope/common/lib/policy/AccountPolicyTO.java |  3 +-
 .../common/lib/policy/PasswordPolicyTO.java        |  3 +-
 .../apache/syncope/common/lib/policy/PolicyTO.java |  2 +-
 .../apache/syncope/common/lib/request/AnyCR.java   |  2 +-
 .../syncope/common/lib/request/AnyObjectCR.java    |  3 +-
 .../syncope/common/lib/request/AnyObjectUR.java    |  3 +-
 .../apache/syncope/common/lib/request/AnyUR.java   |  2 +-
 .../apache/syncope/common/lib/request/GroupCR.java |  3 +-
 .../apache/syncope/common/lib/request/GroupUR.java |  3 +-
 .../apache/syncope/common/lib/request/UserCR.java  |  3 +-
 .../apache/syncope/common/lib/request/UserUR.java  |  3 +-
 .../apache/syncope/common/lib/to/AnyObjectTO.java  |  3 +-
 .../org/apache/syncope/common/lib/to/AnyTO.java    |  2 +-
 .../apache/syncope/common/lib/to/DerSchemaTO.java  |  3 +-
 .../org/apache/syncope/common/lib/to/GroupTO.java  |  3 +-
 .../apache/syncope/common/lib/to/MacroTaskTO.java  |  3 +-
 .../syncope/common/lib/to/NotificationTaskTO.java  |  3 +-
 .../syncope/common/lib/to/PlainSchemaTO.java       |  3 +-
 .../syncope/common/lib/to/PropagationTaskTO.java   |  3 +-
 .../apache/syncope/common/lib/to/PullTaskTO.java   |  3 +-
 .../apache/syncope/common/lib/to/PushTaskTO.java   |  3 +-
 .../apache/syncope/common/lib/to/SchedTaskTO.java  |  3 +-
 .../org/apache/syncope/common/lib/to/SchemaTO.java |  2 +-
 .../org/apache/syncope/common/lib/to/TaskTO.java   |  2 +-
 .../org/apache/syncope/common/lib/to/UserTO.java   |  3 +-
 .../apache/syncope/common/lib/to/VirSchemaTO.java  |  3 +-
 .../org/apache/syncope/core/logic/SchemaLogic.java | 51 ++++++--------
 .../core/persistence/api/entity/Schema.java        |  8 +--
 .../core/persistence/api/entity/SchemaLabel.java   | 36 ----------
 .../src/test/resources/domains/MasterContent.xml   |  9 +--
 .../core/persistence/jpa/dao/JPADerSchemaDAO.java  |  7 +-
 .../persistence/jpa/dao/JPAPlainSchemaDAO.java     |  3 +-
 .../core/persistence/jpa/dao/JPAVirSchemaDAO.java  |  7 +-
 .../persistence/jpa/entity/AbstractSchema.java     | 66 +++++++++++++-----
 .../persistence/jpa/entity/JPAEntityFactory.java   |  3 -
 .../persistence/jpa/entity/JPASchemaLabel.java     | 78 ----------------------
 .../persistence/jpa/outer/PlainSchemaTest.java     |  9 ---
 .../src/test/resources/domains/MasterContent.xml   |  9 +--
 .../java/data/SchemaDataBinderImpl.java            | 49 +++-----------
 pom.xml                                            |  2 +-
 51 files changed, 169 insertions(+), 286 deletions(-)

diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyTO.java
index ed672a7137..b988657e71 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AccessPolicyTO.java
@@ -45,7 +45,8 @@ public class AccessPolicyTO extends PolicyTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.AccessPolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.AccessPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
index f684518bad..4d37215fde 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AttrReleasePolicyTO.java
@@ -35,7 +35,8 @@ public class AttrReleasePolicyTO extends PolicyTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.AttrReleasePolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.AttrReleasePolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyTO.java
index 575b1263e6..1753816fac 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/policy/AuthPolicyTO.java
@@ -31,7 +31,8 @@ public class AuthPolicyTO extends PolicyTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.AuthPolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.AuthPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/CASSPClientAppTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/CASSPClientAppTO.java
index e8b648023d..60589f4e41 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/CASSPClientAppTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/CASSPClientAppTO.java
@@ -24,7 +24,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-@Schema(allOf = {ClientAppTO.class})
+@Schema(allOf = { ClientAppTO.class })
 public class CASSPClientAppTO extends ClientAppTO {
 
     private static final long serialVersionUID = -5370888503924521351L;
@@ -41,7 +41,8 @@ public class CASSPClientAppTO extends ClientAppTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.client.CASSPTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.client.CASSPTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
@@ -60,16 +61,16 @@ public class CASSPClientAppTO extends ClientAppTO {
         }
         CASSPClientAppTO rhs = (CASSPClientAppTO) obj;
         return new EqualsBuilder()
-            .appendSuper(super.equals(obj))
-            .append(this.serviceId, rhs.serviceId)
-            .isEquals();
+                .appendSuper(super.equals(obj))
+                .append(this.serviceId, rhs.serviceId)
+                .isEquals();
     }
 
     @Override
     public int hashCode() {
         return new HashCodeBuilder()
-            .appendSuper(super.hashCode())
-            .append(this.serviceId)
-            .toHashCode();
+                .appendSuper(super.hashCode())
+                .append(this.serviceId)
+                .toHashCode();
     }
 }
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/ClientAppTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/ClientAppTO.java
index 4b680cc62a..e1daf364a0 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/ClientAppTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/ClientAppTO.java
@@ -63,7 +63,7 @@ public abstract class ClientAppTO implements NamedEntityTO {
 
     private final List<Attr> properties = new ArrayList<>();
 
-    @Schema(name = "_class", required = true)
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/OIDCRPClientAppTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/OIDCRPClientAppTO.java
index 80d35821f3..a40eae7aac 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/OIDCRPClientAppTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/OIDCRPClientAppTO.java
@@ -57,7 +57,8 @@ public class OIDCRPClientAppTO extends ClientAppTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.client.OIDCRPTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.client.OIDCRPTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPClientAppTO.java b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPClientAppTO.java
index 61a0f39680..7887bbcd21 100644
--- a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPClientAppTO.java
+++ b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/SAML2SPClientAppTO.java
@@ -74,7 +74,8 @@ public class SAML2SPClientAppTO extends ClientAppTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.client.SAML2SPTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.client.SAML2SPTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PropagationPolicyTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PropagationPolicyTO.java
index 19e27279ad..4a598c628b 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PropagationPolicyTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PropagationPolicyTO.java
@@ -40,7 +40,8 @@ public class PropagationPolicyTO extends PolicyTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.PropagationPolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.PropagationPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/ProvisioningPolicyTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/ProvisioningPolicyTO.java
index 5dd01226b2..daf2702656 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/ProvisioningPolicyTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/ProvisioningPolicyTO.java
@@ -39,7 +39,8 @@ public abstract class ProvisioningPolicyTO extends PolicyTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.ProvisioningPolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.ProvisioningPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
index 1cd2939870..6fec12716c 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
@@ -29,7 +29,8 @@ public class PullPolicyTO extends ProvisioningPolicyTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.PullPolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.PullPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PushPolicyTO.java b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PushPolicyTO.java
index 8b958d4c3e..fc52b71b0b 100644
--- a/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PushPolicyTO.java
+++ b/common/idm/lib/src/main/java/org/apache/syncope/common/lib/policy/PushPolicyTO.java
@@ -29,7 +29,8 @@ public class PushPolicyTO extends ProvisioningPolicyTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.PushPolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.PushPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
index fee5590e5c..e3c1b273d6 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
@@ -40,7 +40,8 @@ public class AccountPolicyTO extends PolicyTO implements ComposablePolicy {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.AccountPolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.AccountPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
index a73fe92f94..2dd3a9b799 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
@@ -40,7 +40,8 @@ public class PasswordPolicyTO extends PolicyTO implements ComposablePolicy {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.policy.PasswordPolicyTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.policy.PasswordPolicyTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
index 4bd405a57b..738904cf86 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyTO.java
@@ -50,7 +50,7 @@ public abstract class PolicyTO implements NamedEntityTO {
 
     private final List<String> usedByRealms = new ArrayList<>();
 
-    @Schema(name = "_class", required = true)
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java
index 7b65838076..e577607e2e 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java
@@ -151,7 +151,7 @@ public abstract class AnyCR implements BaseBean, RealmMember {
 
     private final Set<String> resources = new HashSet<>();
 
-    @Schema(name = "_class", required = true)
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectCR.java
index abc014ef82..701ed11b71 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectCR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectCR.java
@@ -94,7 +94,8 @@ public class AnyObjectCR extends AnyCR implements GroupableRelatableTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.AnyObjectCR")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.request.AnyObjectCR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectUR.java
index 893852eb4f..6064c85847 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyObjectUR.java
@@ -89,7 +89,8 @@ public class AnyObjectUR extends AnyUR {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.AnyObjectUR")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.request.AnyObjectUR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java
index cf92b34c34..1050b4314e 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java
@@ -158,7 +158,7 @@ public abstract class AnyUR implements BaseBean {
 
     private final Set<StringPatchItem> resources = new HashSet<>();
 
-    @Schema(name = "_class", required = true)
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupCR.java
index c47edbb300..bcf529504d 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupCR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupCR.java
@@ -100,7 +100,8 @@ public class GroupCR extends AnyCR {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.GroupCR")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.request.GroupCR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupUR.java
index c6e9f253f9..147c3cb048 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/GroupUR.java
@@ -109,7 +109,8 @@ public class GroupUR extends AnyUR {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.GroupUR")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.request.GroupUR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java
index 666cf748ef..fb141c16c6 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java
@@ -163,7 +163,8 @@ public class UserCR extends AnyCR implements GroupableRelatableTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.UserCR")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.request.UserCR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java
index dd57c97e22..6bda4c36a1 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java
@@ -137,7 +137,8 @@ public class UserUR extends AnyUR {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.request.UserUR")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.request.UserUR")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
index affa16721b..4975086601 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
@@ -44,7 +44,8 @@ public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.AnyObjectTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.AnyObjectTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
index 071256faa4..859766ecb3 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
@@ -92,7 +92,7 @@ public abstract class AnyTO implements EntityTO, RealmMember {
 
     private final Set<String> resources = new TreeSet<>();
 
-    @Schema(name = "_class", required = true)
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
index b467ce24bf..08eb254dc3 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/DerSchemaTO.java
@@ -33,7 +33,8 @@ public class DerSchemaTO extends SchemaTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.DerSchemaTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.DerSchemaTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
index c0a1005514..71c1106932 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
@@ -59,7 +59,8 @@ public class GroupTO extends AnyTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.GroupTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.GroupTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MacroTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MacroTaskTO.java
index 01bf44eb6f..8f9277851c 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MacroTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/MacroTaskTO.java
@@ -43,7 +43,8 @@ public class MacroTaskTO extends SchedTaskTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.MacroTaskTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.MacroTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
index 1036ed565b..bcc36b4ab7 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTaskTO.java
@@ -56,7 +56,8 @@ public class NotificationTaskTO extends TaskTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.NotificationTaskTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.NotificationTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
index 5525b5b7c7..4b115ccc5b 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PlainSchemaTO.java
@@ -58,7 +58,8 @@ public class PlainSchemaTO extends SchemaTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.PlainSchemaTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.PlainSchemaTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
index e831fdb8bc..e90bfc65e5 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PropagationTaskTO.java
@@ -53,7 +53,8 @@ public class PropagationTaskTO extends TaskTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.PropagationTaskTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.PropagationTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
index 425eb281b5..d393512e06 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PullTaskTO.java
@@ -44,7 +44,8 @@ public class PullTaskTO extends ProvisioningTaskTO implements TemplatableTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.PullTaskTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.PullTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
index 6c41491d70..abf91f65fc 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
@@ -38,7 +38,8 @@ public class PushTaskTO extends ProvisioningTaskTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.PushTaskTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.PushTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
index 054d6531dd..cb3e47a658 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchedTaskTO.java
@@ -50,7 +50,8 @@ public class SchedTaskTO extends TaskTO implements NamedEntityTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.SchedTaskTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.SchedTaskTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
index ed102c7a30..7d32b5d753 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/SchemaTO.java
@@ -48,7 +48,7 @@ public abstract class SchemaTO implements EntityTO {
 
     private final Map<Locale, String> labels = new HashMap<>();
 
-    @Schema(name = "_class", required = true)
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
index 0f55ada540..baf9b86f3e 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/TaskTO.java
@@ -53,7 +53,7 @@ public abstract class TaskTO extends AbstractStartEndBean implements EntityTO {
 
     private final List<ExecTO> executions = new ArrayList<>();
 
-    @Schema(name = "_class", required = true)
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED)
     public abstract String getDiscriminator();
 
     public void setDiscriminator(final String discriminator) {
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
index 4c547d7440..776fd5e019 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
@@ -80,7 +80,8 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.UserTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.UserTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
index 7150ff34b4..79723119b4 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/VirSchemaTO.java
@@ -39,7 +39,8 @@ public class VirSchemaTO extends SchemaTO {
 
     @JacksonXmlProperty(localName = "_class", isAttribute = true)
     @JsonProperty("_class")
-    @Schema(name = "_class", required = true, example = "org.apache.syncope.common.lib.to.VirSchemaTO")
+    @Schema(name = "_class", requiredMode = Schema.RequiredMode.REQUIRED,
+            example = "org.apache.syncope.common.lib.to.VirSchemaTO")
     @Override
     public String getDiscriminator() {
         return getClass().getName();
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
index 0b03aced85..531b7e9ff4 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
@@ -113,19 +113,16 @@ public class SchemaLogic extends AbstractTransactionalLogic<SchemaTO> {
         T created;
         switch (schemaType) {
             case VIRTUAL:
-                VirSchema virSchema = virSchemaDAO.save(binder.create((VirSchemaTO) schemaTO));
-                created = (T) binder.getVirSchemaTO(virSchema.getKey());
+                created = (T) binder.getVirSchemaTO(binder.create((VirSchemaTO) schemaTO).getKey());
                 break;
 
             case DERIVED:
-                DerSchema derSchema = derSchemaDAO.save(binder.create((DerSchemaTO) schemaTO));
-                created = (T) binder.getDerSchemaTO(derSchema.getKey());
+                created = (T) binder.getDerSchemaTO(binder.create((DerSchemaTO) schemaTO).getKey());
                 break;
 
             case PLAIN:
             default:
-                PlainSchema plainSchema = plainSchemaDAO.save(binder.create((PlainSchemaTO) schemaTO));
-                created = (T) binder.getPlainSchemaTO(plainSchema.getKey());
+                created = (T) binder.getPlainSchemaTO(binder.create((PlainSchemaTO) schemaTO).getKey());
         }
         return created;
     }
@@ -175,18 +172,18 @@ public class SchemaLogic extends AbstractTransactionalLogic<SchemaTO> {
         switch (schemaType) {
             case VIRTUAL:
                 result = (classes.isEmpty()
-                        ? keyword == null
-                                ? virSchemaDAO.findAll()
-                                : virSchemaDAO.findByKeyword(keyword)
+                        ? Optional.ofNullable(keyword).
+                                map(k -> virSchemaDAO.findByKeyword(k)).
+                                orElseGet(() -> virSchemaDAO.findAll())
                         : virSchemaDAO.findByAnyTypeClasses(classes)).stream().
                         map(schema -> (T) binder.getVirSchemaTO(schema.getKey())).collect(Collectors.toList());
                 break;
 
             case DERIVED:
                 result = (classes.isEmpty()
-                        ? keyword == null
-                                ? derSchemaDAO.findAll()
-                                : derSchemaDAO.findByKeyword(keyword)
+                        ? Optional.ofNullable(keyword).
+                                map(k -> derSchemaDAO.findByKeyword(k)).
+                                orElseGet(() -> derSchemaDAO.findAll())
                         : derSchemaDAO.findByAnyTypeClasses(classes)).stream().
                         map(schema -> (T) binder.getDerSchemaTO(schema.getKey())).collect(Collectors.toList());
                 break;
@@ -194,9 +191,9 @@ public class SchemaLogic extends AbstractTransactionalLogic<SchemaTO> {
             case PLAIN:
             default:
                 result = (classes.isEmpty()
-                        ? keyword == null
-                                ? plainSchemaDAO.findAll()
-                                : plainSchemaDAO.findByKeyword(keyword)
+                        ? Optional.ofNullable(keyword).
+                                map(k -> plainSchemaDAO.findByKeyword(k)).
+                                orElseGet(() -> plainSchemaDAO.findAll())
                         : plainSchemaDAO.findByAnyTypeClasses(classes)).stream().
                         map(schema -> (T) binder.getPlainSchemaTO(schema.getKey())).collect(Collectors.toList());
         }
@@ -233,31 +230,25 @@ public class SchemaLogic extends AbstractTransactionalLogic<SchemaTO> {
 
         switch (schemaType) {
             case VIRTUAL:
-                VirSchema virSchema = virSchemaDAO.find(schemaTO.getKey());
-                if (virSchema == null) {
-                    throw new NotFoundException("Virtual Schema '" + schemaTO.getKey() + '\'');
-                }
+                VirSchema virSchema = Optional.ofNullable(virSchemaDAO.find(schemaTO.getKey())).
+                        orElseThrow(() -> new NotFoundException("Virtual Schema '" + schemaTO.getKey() + '\''));
 
-                virSchemaDAO.save(binder.update((VirSchemaTO) schemaTO, virSchema));
+                binder.update((VirSchemaTO) schemaTO, virSchema);
                 break;
 
             case DERIVED:
-                DerSchema derSchema = derSchemaDAO.find(schemaTO.getKey());
-                if (derSchema == null) {
-                    throw new NotFoundException("Derived schema '" + schemaTO.getKey() + '\'');
-                }
+                DerSchema derSchema = Optional.ofNullable(derSchemaDAO.find(schemaTO.getKey())).
+                        orElseThrow(() -> new NotFoundException("Derived Schema '" + schemaTO.getKey() + '\''));
 
-                derSchemaDAO.save(binder.update((DerSchemaTO) schemaTO, derSchema));
+                binder.update((DerSchemaTO) schemaTO, derSchema);
                 break;
 
             case PLAIN:
             default:
-                PlainSchema plainSchema = plainSchemaDAO.find(schemaTO.getKey());
-                if (plainSchema == null) {
-                    throw new NotFoundException("Schema '" + schemaTO.getKey() + '\'');
-                }
+                PlainSchema plainSchema = Optional.ofNullable(plainSchemaDAO.find(schemaTO.getKey())).
+                        orElseThrow(() -> new NotFoundException("Plain Schema '" + schemaTO.getKey() + '\''));
 
-                plainSchemaDAO.save(binder.update((PlainSchemaTO) schemaTO, plainSchema));
+                binder.update((PlainSchemaTO) schemaTO, plainSchema);
         }
     }
 
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Schema.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Schema.java
index ec80bae1cf..bb271b1b4a 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Schema.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Schema.java
@@ -18,8 +18,8 @@
  */
 package org.apache.syncope.core.persistence.api.entity;
 
-import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Optional;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 
@@ -39,9 +39,7 @@ public interface Schema extends ProvidedKeyEntity {
 
     boolean isUniqueConstraint();
 
-    boolean add(SchemaLabel label);
+    Optional<String> getLabel(Locale locale);
 
-    Optional<? extends SchemaLabel> getLabel(Locale locale);
-
-    List<? extends SchemaLabel> getLabels();
+    Map<Locale, String> getLabels();
 }
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SchemaLabel.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SchemaLabel.java
deleted file mode 100644
index 1ba2f7c5f4..0000000000
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SchemaLabel.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.api.entity;
-
-import java.util.Locale;
-
-public interface SchemaLabel extends Entity {
-
-    Schema getSchema();
-
-    void setSchema(Schema schema);
-
-    Locale getLocale();
-
-    void setLocale(Locale locale);
-
-    String getDisplay();
-
-    void setDisplay(String display);
-}
diff --git a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
index 942bf5e987..bd3532be8a 100644
--- a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
@@ -132,17 +132,12 @@ under the License.
   <PlainSchema id="loginDate" type="Date" anyTypeClass_id="other"
                mandatoryCondition="false" multivalue="1" uniqueConstraint="0" readonly="0"
                conversionPattern="yyyy-MM-dd"/>
-  <SyncopeSchema id="firstname"/>
+  <SyncopeSchema id="firstname" labels='{"en":"Firstname","it":"Nome","pt_BR":"Nome"}'/>
   <PlainSchema id="firstname" type="String" anyTypeClass_id="minimal user"
                mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <SchemaLabel id="d90f90d0-cf15-407e-bac7-d46a8eb57c05" schema_id="firstname" locale="en" display="Firstname"/>
-  <SchemaLabel id="a9465ef0-b8b4-4af4-840d-77031a6b54a0" schema_id="firstname" locale="it" display="Nome"/>
-  <SchemaLabel id="ac8b7383-62df-490d-9364-88dbd3d301aa" schema_id="firstname" locale="pt_BR" display="Nome"/>
-  <SyncopeSchema id="surname"/>
+  <SyncopeSchema id="surname" labels='{"en":"Surname","it":"Cognome"}'/>
   <PlainSchema id="surname" type="String" anyTypeClass_id="minimal user"
                mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <SchemaLabel id="69712058-162a-4e2a-b07e-c78d82dc286d" schema_id="surname" locale="en" display="Surname"/>
-  <SchemaLabel id="77e7bbbb-d30c-47e1-b6d2-e0a9e8c11fe2" schema_id="surname" locale="it" display="Cognome"/>
   <SyncopeSchema id="ctype"/>
   <PlainSchema id="ctype" type="String" anyTypeClass_id="other"
                mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"/>
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
index 555f538b81..9bd1393e95 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
@@ -72,8 +72,9 @@ public class JPADerSchemaDAO extends AbstractDAO<DerSchema> implements DerSchema
     }
 
     @Override
-    public DerSchema save(final DerSchema derSchema) {
-        return entityManager().merge(derSchema);
+    public DerSchema save(final DerSchema schema) {
+        ((JPADerSchema) schema).map2json();
+        return entityManager().merge(schema);
     }
 
     @Override
@@ -83,8 +84,6 @@ public class JPADerSchemaDAO extends AbstractDAO<DerSchema> implements DerSchema
             return;
         }
 
-        schema.getLabels().forEach(label -> label.setSchema(null));
-
         resourceDAO.deleteMapping(key);
 
         if (schema.getAnyTypeClass() != null) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
index f84e82f928..6734b99105 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
@@ -126,6 +126,7 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain
 
     @Override
     public PlainSchema save(final PlainSchema schema) {
+        ((JPAPlainSchema) schema).map2json();
         return entityManager().merge(schema);
     }
 
@@ -143,8 +144,6 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain
             return;
         }
 
-        schema.getLabels().forEach(label -> label.setSchema(null));
-
         deleteAttrs(schema);
 
         resourceDAO.deleteMapping(key);
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 9452c685e5..8c7a124115 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
@@ -104,8 +104,9 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema> implements VirSchema
     }
 
     @Override
-    public VirSchema save(final VirSchema virSchema) {
-        return entityManager().merge(virSchema);
+    public VirSchema save(final VirSchema schema) {
+        ((JPAVirSchema) schema).map2json();
+        return entityManager().merge(schema);
     }
 
     @Override
@@ -115,8 +116,6 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema> implements VirSchema
             return;
         }
 
-        schema.getLabels().forEach(label -> label.setSchema(null));
-
         resourceDAO.deleteMapping(key);
 
         if (schema.getAnyTypeClass() != null) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractSchema.java
index 6b66e51fbd..0e76189815 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractSchema.java
@@ -18,21 +18,26 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity;
 
-import java.util.ArrayList;
-import java.util.List;
+import com.fasterxml.jackson.core.type.TypeReference;
+import java.util.HashMap;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Optional;
 import javax.persistence.Cacheable;
-import javax.persistence.CascadeType;
 import javax.persistence.Entity;
-import javax.persistence.FetchType;
 import javax.persistence.Inheritance;
 import javax.persistence.InheritanceType;
-import javax.persistence.OneToMany;
+import javax.persistence.Lob;
+import javax.persistence.PostLoad;
+import javax.persistence.PostPersist;
+import javax.persistence.PostUpdate;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
 import javax.persistence.Table;
+import javax.persistence.Transient;
 import org.apache.syncope.core.persistence.api.entity.Schema;
-import org.apache.syncope.core.persistence.api.entity.SchemaLabel;
 import org.apache.syncope.core.persistence.jpa.validation.entity.SchemaKeyCheck;
+import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 
 @Entity
 @Inheritance(strategy = InheritanceType.JOINED)
@@ -41,26 +46,53 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.SchemaKeyCheck;
 @SchemaKeyCheck
 public abstract class AbstractSchema extends AbstractProvidedKeyEntity implements Schema {
 
+    private static final long serialVersionUID = -9222344997225831269L;
+
     public static final String TABLE = "SyncopeSchema";
 
-    private static final long serialVersionUID = -9222344997225831269L;
+    protected static final TypeReference<HashMap<Locale, String>> LABEL_TYPEREF =
+            new TypeReference<HashMap<Locale, String>>() {
+    };
 
-    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY, mappedBy = "schema")
-    private List<JPASchemaLabel> labels = new ArrayList<>();
+    @Lob
+    private String labels;
+
+    @Transient
+    private Map<Locale, String> labelMap = new HashMap<>();
 
     @Override
-    public boolean add(final SchemaLabel label) {
-        checkType(label, JPASchemaLabel.class);
-        return this.labels.add((JPASchemaLabel) label);
+    public Optional<String> getLabel(final Locale locale) {
+        return Optional.ofNullable(labelMap.get(locale));
     }
 
     @Override
-    public Optional<? extends SchemaLabel> getLabel(final Locale locale) {
-        return labels.stream().filter(label -> label.getLocale().equals(locale)).findFirst();
+    public Map<Locale, String> getLabels() {
+        return labelMap;
     }
 
-    @Override
-    public List<? extends SchemaLabel> getLabels() {
-        return labels;
+    protected void json2map(final boolean clearFirst) {
+        if (clearFirst) {
+            getLabels().clear();
+        }
+        if (labels != null) {
+            getLabels().putAll(POJOHelper.deserialize(labels, LABEL_TYPEREF));
+        }
+    }
+
+    @PostLoad
+    public void postLoad() {
+        json2map(false);
+    }
+
+    @PostPersist
+    @PostUpdate
+    public void postSave() {
+        json2map(true);
+    }
+
+    @PrePersist
+    @PreUpdate
+    public void map2json() {
+        labels = POJOHelper.serialize(getLabels());
     }
 }
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 4798a2c919..0c35c840c7 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
@@ -51,7 +51,6 @@ import org.apache.syncope.core.persistence.api.entity.ReportExec;
 import org.apache.syncope.core.persistence.api.entity.ReportTemplate;
 import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.SRARoute;
-import org.apache.syncope.core.persistence.api.entity.SchemaLabel;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.am.AttrRepo;
 import org.apache.syncope.core.persistence.api.entity.am.AuthModule;
@@ -231,8 +230,6 @@ public class JPAEntityFactory implements EntityFactory {
             result = (E) new JPAConnInstance();
         } else if (reference.equals(ExternalResource.class)) {
             result = (E) new JPAExternalResource();
-        } else if (reference.equals(SchemaLabel.class)) {
-            result = (E) new JPASchemaLabel();
         } else if (reference.equals(PlainSchema.class)) {
             result = (E) new JPAPlainSchema();
         } else if (reference.equals(APlainAttr.class)) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASchemaLabel.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASchemaLabel.java
deleted file mode 100644
index 53330b150b..0000000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASchemaLabel.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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 java.util.Locale;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-import org.apache.syncope.core.persistence.api.entity.Schema;
-import org.apache.syncope.core.persistence.api.entity.SchemaLabel;
-
-@Entity
-@Table(name = JPASchemaLabel.TABLE, uniqueConstraints =
-        @UniqueConstraint(columnNames = { "schema_id", "locale" }))
-public class JPASchemaLabel extends AbstractGeneratedKeyEntity implements SchemaLabel {
-
-    public static final String TABLE = "SchemaLabel";
-
-    private static final long serialVersionUID = -546019894866607764L;
-
-    @ManyToOne
-    private AbstractSchema schema;
-
-    @Column(nullable = false)
-    private Locale locale;
-
-    @Column(nullable = false)
-    private String display;
-
-    @Override
-    public AbstractSchema getSchema() {
-        return schema;
-    }
-
-    @Override
-    public void setSchema(final Schema schema) {
-        checkType(schema, AbstractSchema.class);
-        this.schema = (AbstractSchema) schema;
-    }
-
-    @Override
-    public Locale getLocale() {
-        return locale;
-    }
-
-    @Override
-    public void setLocale(final Locale locale) {
-        this.locale = locale;
-    }
-
-    @Override
-    public String getDisplay() {
-        return display;
-    }
-
-    @Override
-    public void setDisplay(final String display) {
-        this.display = display;
-    }
-}
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
index 388e4369cd..b993a85f61 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
@@ -41,10 +41,8 @@ import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.SchemaLabel;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
 import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.apache.syncope.core.persistence.jpa.entity.JPASchemaLabel;
 import org.apache.syncope.core.spring.security.SyncopeAuthenticationDetails;
 import org.apache.syncope.core.spring.security.SyncopeGrantedAuthority;
 import org.junit.jupiter.api.AfterAll;
@@ -167,9 +165,6 @@ public class PlainSchemaTest extends AbstractTest {
         assertFalse(mapItems.isEmpty());
 
         // check for labels
-        List<SchemaLabel> labels = entityManager().createQuery(
-                "SELECT e FROM " + JPASchemaLabel.class.getSimpleName() + " e", SchemaLabel.class).getResultList();
-        assertEquals(5, labels.size());
         assertEquals(2, schema.getLabels().size());
 
         // delete user schema surname
@@ -180,10 +175,6 @@ public class PlainSchemaTest extends AbstractTest {
         // check for schema deletion
         schema = plainSchemaDAO.find("surname");
         assertNull(schema);
-
-        labels = entityManager().createQuery(
-                "SELECT e FROM " + JPASchemaLabel.class.getSimpleName() + " e", SchemaLabel.class).getResultList();
-        assertEquals(3, labels.size());
     }
 
     @Test
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index eede6391c0..2068736e3c 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -307,17 +307,12 @@ under the License.
   <PlainSchema id="loginDate" type="Date" anyTypeClass_id="other"
                mandatoryCondition="false" multivalue="1" uniqueConstraint="0" readonly="0"
                conversionPattern="yyyy-MM-dd"/>
-  <SyncopeSchema id="firstname"/>
+  <SyncopeSchema id="firstname" labels='{"en":"Firstname","it":"Nome","pt_BR":"Nome"}'/>
   <PlainSchema id="firstname" type="String" anyTypeClass_id="minimal user"
                mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <SchemaLabel id="d90f90d0-cf15-407e-bac7-d46a8eb57c05" schema_id="firstname" locale="en" display="Firstname"/>
-  <SchemaLabel id="a9465ef0-b8b4-4af4-840d-77031a6b54a0" schema_id="firstname" locale="it" display="Nome"/>
-  <SchemaLabel id="ac8b7383-62df-490d-9364-88dbd3d301aa" schema_id="firstname" locale="pt_BR" display="Nome"/>
-  <SyncopeSchema id="surname"/>
+  <SyncopeSchema id="surname" labels='{"en":"Surname","it":"Cognome"}'/>
   <PlainSchema id="surname" type="String" anyTypeClass_id="minimal user"
                mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <SchemaLabel id="69712058-162a-4e2a-b07e-c78d82dc286d" schema_id="surname" locale="en" display="Surname"/>
-  <SchemaLabel id="77e7bbbb-d30c-47e1-b6d2-e0a9e8c11fe2" schema_id="surname" locale="it" display="Cognome"/>
   <SyncopeSchema id="ctype"/>
   <PlainSchema id="ctype" type="String" anyTypeClass_id="other"
                mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"/>
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
index 89ceae71cc..fc7bcd71db 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
@@ -18,14 +18,12 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
-import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.Provision;
-import org.apache.syncope.common.lib.to.SchemaTO;
 import org.apache.syncope.common.lib.to.VirSchemaTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
@@ -46,8 +44,6 @@ import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.Schema;
-import org.apache.syncope.core.persistence.api.entity.SchemaLabel;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
 import org.apache.syncope.core.provisioning.api.jexl.JexlUtils;
@@ -98,26 +94,6 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         this.anyUtilsFactory = anyUtilsFactory;
     }
 
-    protected <S extends Schema, T extends SchemaTO> void labels(final T src, final S dst) {
-        src.getLabels().forEach((locale, display) -> {
-            SchemaLabel label = dst.getLabel(locale).orElse(null);
-            if (label == null) {
-                label = entityFactory.newEntity(SchemaLabel.class);
-                label.setLocale(locale);
-                label.setSchema(dst);
-                dst.add(label);
-            }
-            label.setDisplay(display);
-        });
-
-        dst.getLabels().removeIf(label -> !src.getLabels().containsKey(label.getLocale()));
-    }
-
-    protected static <S extends Schema, T extends SchemaTO> void labels(final S src, final T dst) {
-        dst.getLabels().putAll(src.getLabels().stream().
-                collect(Collectors.toMap(SchemaLabel::getLocale, SchemaLabel::getDisplay)));
-    }
-
     // --------------- PLAIN -----------------
     protected PlainSchema fill(final PlainSchema schema, final PlainSchemaTO schemaTO) {
         if (!JexlUtils.isExpressionValid(schemaTO.getMandatoryCondition())) {
@@ -139,8 +115,9 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         schema.setSecretKey(schemaTO.getSecretKey());
         schema.setUniqueConstraint(schemaTO.isUniqueConstraint());
 
-        labels(schemaTO, schema);
-
+        schema.getLabels().clear();
+        schema.getLabels().putAll(schemaTO.getLabels());
+        
         if (schemaTO.getValidator() == null) {
             schema.setValidator(null);
         } else {
@@ -232,9 +209,7 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         schemaTO.setReadonly(schema.isReadonly());
         schemaTO.setSecretKey(schema.getSecretKey());
         schemaTO.setUniqueConstraint(schema.isUniqueConstraint());
-
-        labels(schema, schemaTO);
-
+        schemaTO.getLabels().putAll(schema.getLabels());
         schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
         if (schema.getValidator() != null) {
             schemaTO.setValidator(schema.getValidator().getKey());
@@ -267,7 +242,8 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         schema.setKey(schemaTO.getKey());
         schema.setExpression(schemaTO.getExpression());
 
-        labels(schemaTO, schema);
+        schema.getLabels().clear();
+        schema.getLabels().putAll(schemaTO.getLabels());
 
         DerSchema merged = derSchemaDAO.save(schema);
 
@@ -311,11 +287,8 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         DerSchemaTO schemaTO = new DerSchemaTO();
         schemaTO.setKey(schema.getKey());
         schemaTO.setExpression(schema.getExpression());
-
-        labels(schema, schemaTO);
-
+        schemaTO.getLabels().putAll(schema.getLabels());
         schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
-
         return schemaTO;
     }
 
@@ -325,7 +298,8 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         schema.setExtAttrName(schemaTO.getExtAttrName());
         schema.setReadonly(schemaTO.isReadonly());
 
-        labels(schemaTO, schema);
+        schema.getLabels().clear();
+        schema.getLabels().putAll(schemaTO.getLabels());
 
         if (schemaTO.getAnyTypeClass() != null
                 && (schema.getAnyTypeClass() == null
@@ -390,13 +364,10 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         schemaTO.setKey(schema.getKey());
         schemaTO.setExtAttrName(schema.getExtAttrName());
         schemaTO.setReadonly(schema.isReadonly());
-
-        labels(schema, schemaTO);
-
+        schemaTO.getLabels().putAll(schema.getLabels());
         schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
         schemaTO.setResource(schema.getResource().getKey());
         schemaTO.setAnyType(schema.getAnyType().getKey());
-
         return schemaTO;
     }
 }
diff --git a/pom.xml b/pom.xml
index a9fc156de4..4387cec393 100644
--- a/pom.xml
+++ b/pom.xml
@@ -432,7 +432,7 @@ under the License.
 
     <slf4j.version>1.7.36</slf4j.version>
 
-    <elasticsearch.version>8.5.1</elasticsearch.version>
+    <elasticsearch.version>8.5.2</elasticsearch.version>
 
     <apacheds.version>2.0.0.AM26</apacheds.version>
     <apachedirapi.version>2.0.0</apachedirapi.version>