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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2f0f4d6ec3 ISIS-3119: convert remaining IdStringifiers to 
ValueSemantics Providers
2f0f4d6ec3 is described below

commit 2f0f4d6ec3a316c9ca71c1f95a7403f3b0cd55a3
Author: Andi Huber <[email protected]>
AuthorDate: Thu Aug 11 13:25:19 2022 +0200

    ISIS-3119: convert remaining IdStringifiers to ValueSemantics Providers
---
 .../applib/services/bookmark/IdStringifier.java    | 71 ++++++++--------------
 .../ValueSemanticsBasedOnIdStringifier.java        | 13 ++--
 ...IdStringifierWithTargetEntityClassSupport.java} | 19 +++---
 .../idstringifier/IdStringifierLookupService.java  | 12 +++-
 .../IsisModulePersistenceJdoDatanucleus.java       | 68 ++++++++++-----------
 .../metamodel/facets/entity/JdoEntityFacet.java    |  2 +-
 .../{applib => }/ByteArrayBlobRdbmsMapping.java    |  2 +-
 .../applib => valuemappings}/IsisBlobMapping.java  |  2 +-
 .../applib => valuemappings}/IsisClobMapping.java  |  2 +-
 .../JdoByteIdValueSemantics.java}                  |  9 +--
 .../JdoByteIdentityValueSemantics.java}            |  9 +--
 .../JdoCharIdValueSemantics.java}                  | 10 +--
 .../JdoCharIdentityValueSemantics.java}            | 10 +--
 .../JdoDatastoreIdImplValueSemantics.java}         |  9 +--
 .../JdoDatastoreIdValueSemantics.java}             | 12 ++--
 .../JdoDatastoreUniqueLongIdValueSemantics.java}   |  9 +--
 .../JdoIntIdValueSemantics.java}                   | 10 +--
 .../JdoIntIdentityValueSemantics.java}             |  9 +--
 .../JdoLongIdValueSemantics.java}                  | 10 +--
 .../JdoLongIdentityValueSemantics.java}            |  9 +--
 .../JdoObjectIdValueSemantics.java}                |  9 +--
 .../JdoObjectIdentityValueSemantics.java}          |  9 +--
 .../JdoShortIdValueSemantics.java}                 | 10 +--
 .../JdoShortIdentityValueSemantics.java}           |  9 +--
 .../JdoStringIdValueSemantics.java}                | 10 +--
 .../JdoStringIdentityValueSemantics.java}          | 10 +--
 .../jdo/datanucleus/src/main/resources/plugin.xml  |  8 +--
 .../oid/IdStringifierForByteIdentity_Test.java     |  4 +-
 .../oid/IdStringifierForCharIdentity_Test.java     |  4 +-
 ...erForDatastoreId_DatastoreIdImpl_long_Test.java |  4 +-
 ...atastoreId_DatastoreUniqueLongId_long_Test.java |  6 +-
 ...DatastoreId_DatastoreUniqueLongId_str_Test.java |  6 +-
 .../oid/IdStringifierForIntId_Test.java            |  6 +-
 .../oid/IdStringifierForIntIdentity_Test.java      |  4 +-
 .../oid/IdStringifierForLongId_Test.java           |  6 +-
 .../oid/IdStringifierForLongIdentity_Test.java     |  4 +-
 .../oid/IdStringifierForObjectIdentity_Test.java   |  4 +-
 .../oid/IdStringifierForShortIdentity_Test.java    |  4 +-
 .../oid/IdStringifierForStringIdentity_Test.java   |  4 +-
 .../jpa/integration/entity/JpaEntityFacet.java     |  2 +-
 40 files changed, 209 insertions(+), 211 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
index 04c8e96033..5b0a0d0f5e 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
@@ -20,8 +20,6 @@
 
 package org.apache.isis.applib.services.bookmark;
 
-import org.springframework.util.ClassUtils;
-
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 
@@ -52,30 +50,11 @@ public interface IdStringifier<T> {
 
     Class<T> getCorrespondingClass();
 
-//    /**
-//     * Whether this {@link IdStringifier} is able to {@link 
#enstring(Object)} or {@link #destring(String, Class)} values
-//     * of this type.
-//     *
-//     * <p>
-//     * Even though some implementations also require the owning entity type 
in order to {@link #destring(String, Class)},
-//     * we do not consider that as part of this function; we assume that the 
entity type will be provided
-//     * when necessary (by the JDO entity facet, in fact).  This is 
sufficient.
-//     * </p>
-//     *
-//     * @param candidateValueClass
-//     */
-    @Deprecated
-    default boolean handles(final @NonNull Class<?> candidateValueClass) {
-        return getCorrespondingClass()
-                
.isAssignableFrom(ClassUtils.resolvePrimitiveIfNecessary(candidateValueClass));
-    }
-
     /**
-     * Convert the value (which will be of the same type as is {@link 
#handles(Class) handled} into a string
-     * representation.
+     * Convert the value (which will be of the same type as returned by {@link 
#getCorrespondingClass()}
+     * into a string representation.
      *
      * @see #destring(String)
-     * @see #handles(Class)
      */
     String enstring(@NonNull T value);
 
@@ -87,7 +66,26 @@ public interface IdStringifier<T> {
      */
     T destring(@NonNull String stringified);
 
-    abstract class Abstract<T> implements IdStringifier<T> {
+
+    interface SupportingTargetEntityClass<T> extends IdStringifier<T> {
+        /**
+         * Convert a string representation of the identifier (as returned by 
{@link #enstring(Object)}) into an object
+         * that can be used to retrieve.
+         *
+         * @param stringified - as returned by {@link #enstring(Object)}
+         * @param targetEntityClass - the class of the target entity, eg 
<code>Customer</code>.  For both JDO and JPA,
+         *                                 we always have this information 
available, and is needed (at least) by the JDO
+         *                                 implementations of application 
primary keys using built-ins, eg <code>LongIdentity</code>.
+         */
+        T destring(@NonNull String stringified, @NonNull Class<?> 
targetEntityClass);
+
+        @Override
+        default T destring(@NonNull final String stringified) {
+            throw _Exceptions.unsupportedOperation();
+        }
+    }
+
+    abstract class Abstract<T> implements SupportingTargetEntityClass<T> {
 
         public final static char SEPARATOR = '_';
 
@@ -99,19 +97,13 @@ public interface IdStringifier<T> {
 
         protected Abstract(
                 final @NonNull Class<T> correspondingClass) {
-
-            _Assert.assertFalse(correspondingClass.isPrimitive());
-
+            _Assert.assertFalse(correspondingClass.isPrimitive(),
+                    ()->String.format("not allowed to be initialzed with a 
primitive class (%s), "
+                            + "use the boxed variant instead",
+                            correspondingClass));
             this.correspondingClass = correspondingClass;
         }
 
-        @Deprecated
-        @Override
-        public final boolean handles(final @NonNull Class<?> 
candidateValueClass) {
-            return getCorrespondingClass()
-                    
.isAssignableFrom(ClassUtils.resolvePrimitiveIfNecessary(candidateValueClass));
-        }
-
         /**
          * Overridable default implementation.
          * @param value
@@ -121,17 +113,6 @@ public interface IdStringifier<T> {
             return value.toString();
         }
 
-        /**
-         * Convert a string representation of the identifier (as returned by 
{@link #enstring(Object)}) into an object
-         * that can be used to retrieve.
-         *
-         * @param stringified - as returned by {@link #enstring(Object)}
-         * @param targetEntityClass - the class of the target entity, eg 
<code>Customer</code>.  For both JDO and JPA,
-         *                                 we always have this information 
available, and is needed (at least) by the JDO
-         *                                 implementations of application 
primary keys using built-ins, eg <code>LongIdentity</code>.
-         */
-        public abstract T destring(@NonNull String stringified, @NonNull 
Class<?> targetEntityClass);
-
         @Override
         public final T destring(@NonNull final String stringified) {
             throw _Exceptions.unsupportedOperation();
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifier.java
 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifier.java
index 0ebaf7772f..ff82a6d475 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifier.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifier.java
@@ -18,8 +18,6 @@
  */
 package org.apache.isis.applib.value.semantics;
 
-import org.springframework.util.ClassUtils;
-
 import org.apache.isis.applib.services.bookmark.IdStringifier;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.schema.common.v2.ValueType;
@@ -41,7 +39,10 @@ implements
 
     protected ValueSemanticsBasedOnIdStringifier(
             final @NonNull Class<T> correspondingClass) {
-        _Assert.assertFalse(correspondingClass.isPrimitive());
+        _Assert.assertFalse(correspondingClass.isPrimitive(),
+                ()->String.format("not allowed to be initialzed with a 
primitive class (%s), "
+                        + "use the boxed variant instead",
+                        correspondingClass));
         this.correspondingClass = correspondingClass;
     }
 
@@ -52,12 +53,6 @@ implements
 
     // -- ID STRINGIFIER
 
-    @Override
-    public final boolean handles(final @NonNull Class<?> candidateValueClass) {
-        return getCorrespondingClass()
-                
.isAssignableFrom(ClassUtils.resolvePrimitiveIfNecessary(candidateValueClass));
-    }
-
     @Override
     public String enstring(@NonNull final T value) {
         return value.toString();
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifier.java
 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport.java
similarity index 80%
copy from 
api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifier.java
copy to 
api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport.java
index 0ebaf7772f..7401064ede 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifier.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport.java
@@ -18,8 +18,6 @@
  */
 package org.apache.isis.applib.value.semantics;
 
-import org.springframework.util.ClassUtils;
-
 import org.apache.isis.applib.services.bookmark.IdStringifier;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.schema.common.v2.ValueType;
@@ -31,17 +29,20 @@ import lombok.experimental.Accessors;
 /**
  * @since 2.x {@index}
  */
-public abstract class ValueSemanticsBasedOnIdStringifier<T>
+public abstract class 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<T>
 extends ValueSemanticsAbstract<T>
 implements
-    IdStringifier<T> {
+    IdStringifier.SupportingTargetEntityClass<T> {
 
     @Getter @Accessors(makeFinal = true)
     private final Class<T> correspondingClass;
 
-    protected ValueSemanticsBasedOnIdStringifier(
+    protected ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport(
             final @NonNull Class<T> correspondingClass) {
-        _Assert.assertFalse(correspondingClass.isPrimitive());
+        _Assert.assertFalse(correspondingClass.isPrimitive(),
+                ()->String.format("not allowed to be initialzed with a 
primitive class (%s), "
+                        + "use the boxed variant instead",
+                        correspondingClass));
         this.correspondingClass = correspondingClass;
     }
 
@@ -52,12 +53,6 @@ implements
 
     // -- ID STRINGIFIER
 
-    @Override
-    public final boolean handles(final @NonNull Class<?> candidateValueClass) {
-        return getCorrespondingClass()
-                
.isAssignableFrom(ClassUtils.resolvePrimitiveIfNecessary(candidateValueClass));
-    }
-
     @Override
     public String enstring(@NonNull final T value) {
         return value.toString();
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/idstringifier/IdStringifierLookupService.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/idstringifier/IdStringifierLookupService.java
index 984aacdeb7..e21c017a34 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/idstringifier/IdStringifierLookupService.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/idstringifier/IdStringifierLookupService.java
@@ -32,6 +32,7 @@ import javax.inject.Named;
 
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ClassUtils;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
@@ -39,6 +40,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.runtime.IsisModuleCoreRuntime;
 
+import lombok.NonNull;
 import lombok.val;
 
 /**
@@ -78,7 +80,7 @@ public class IdStringifierLookupService {
     public <T> IdStringifier<T> lookupElseFail(final Class<T> 
candidateValueClass) {
         val idStringifier = 
stringifierByClass.computeIfAbsent(candidateValueClass, aClass -> {
             for (val candidateStringifier : idStringifiers) {
-                if (candidateStringifier.handles(candidateValueClass)) {
+                if (handles(candidateStringifier, candidateValueClass)) {
                     return candidateStringifier;
                 }
             }
@@ -93,7 +95,7 @@ public class IdStringifierLookupService {
     public <T> Optional<IdStringifier<T>> lookup(final Class<T> 
candidateValueClass) {
         val idStringifier = 
stringifierByClass.computeIfAbsent(candidateValueClass, aClass -> {
             for (val candidateStringifier : idStringifiers) {
-                if (candidateStringifier.handles(candidateValueClass)) {
+                if (handles(candidateStringifier, candidateValueClass)) {
                     return candidateStringifier;
                 }
             }
@@ -101,4 +103,10 @@ public class IdStringifierLookupService {
         });
         return Optional.ofNullable(_Casts.uncheckedCast(idStringifier));
     }
+
+    private boolean handles(final IdStringifier<?> idStringifier, final 
@NonNull Class<?> candidateValueClass) {
+        return idStringifier.getCorrespondingClass()
+                
.isAssignableFrom(ClassUtils.resolvePrimitiveIfNecessary(candidateValueClass));
+    }
+
 }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.java
index 81460561d2..b89a179f22 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.java
@@ -54,26 +54,26 @@ import 
org.apache.isis.persistence.jdo.datanucleus.config.DatanucleusSettings;
 import org.apache.isis.persistence.jdo.datanucleus.dialect.DnJdoDialect;
 import 
org.apache.isis.persistence.jdo.datanucleus.entities.DnEntityStateProvider;
 import 
org.apache.isis.persistence.jdo.datanucleus.jdosupport.JdoSupportServiceDefault;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForByteId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForCharId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForCharIdentity;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreUniqueLongId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForIntId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForLongId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForObjectId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForShortId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForStringId;
 import 
org.apache.isis.persistence.jdo.datanucleus.mixins.Persistable_datanucleusVersionLong;
 import 
org.apache.isis.persistence.jdo.datanucleus.mixins.Persistable_datanucleusVersionTimestamp;
 import 
org.apache.isis.persistence.jdo.datanucleus.mixins.Persistable_downloadJdoMetadata;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForByteIdentity;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreIdImpl;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForIntIdentity;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForLongIdentity;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForObjectIdentity;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForShortIdentity;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForStringIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoByteIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoByteIdentityValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoCharIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoCharIdentityValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdImplValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreUniqueLongIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoIntIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoIntIdentityValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoLongIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoLongIdentityValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoObjectIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoObjectIdentityValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoShortIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoShortIdentityValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoStringIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoStringIdentityValueSemantics;
 import 
org.apache.isis.persistence.jdo.integration.IsisModulePersistenceJdoIntegration;
 import 
org.apache.isis.persistence.jdo.provider.config.JdoEntityDiscoveryListener;
 import org.apache.isis.persistence.jdo.spring.integration.JdoDialect;
@@ -96,23 +96,23 @@ import lombok.extern.log4j.Log4j2;
     // @Component's
     DnEntityStateProvider.class,
 
-    IdStringifierForDatastoreIdImpl.class, // datastore identity
-    IdStringifierForDatastoreUniqueLongId.class,
-    IdStringifierForDatastoreId.class,
-    IdStringifierForShortIdentity.class, // application-defined PK, 
javax.jdo.identity
-    IdStringifierForLongIdentity.class,
-    IdStringifierForIntIdentity.class,
-    IdStringifierForByteIdentity.class,
-    IdStringifierForCharIdentity.class,
-    IdStringifierForStringIdentity.class,
-    IdStringifierForObjectIdentity.class,
-    IdStringifierForShortId.class,  // application-defined PK, 
org.datanucleus.identity
-    IdStringifierForLongId.class,
-    IdStringifierForIntId.class,
-    IdStringifierForByteId.class,
-    IdStringifierForCharId.class,
-    IdStringifierForStringId.class,
-    IdStringifierForObjectId.class,
+    JdoDatastoreIdImplValueSemantics.class, // datastore identity
+    JdoDatastoreUniqueLongIdValueSemantics.class,
+    JdoDatastoreIdValueSemantics.class,
+    JdoShortIdentityValueSemantics.class, // application-defined PK, 
javax.jdo.identity
+    JdoLongIdentityValueSemantics.class,
+    JdoIntIdentityValueSemantics.class,
+    JdoByteIdentityValueSemantics.class,
+    JdoCharIdentityValueSemantics.class,
+    JdoStringIdentityValueSemantics.class,
+    JdoObjectIdentityValueSemantics.class,
+    JdoShortIdValueSemantics.class,  // application-defined PK, 
org.datanucleus.identity
+    JdoLongIdValueSemantics.class,
+    JdoIntIdValueSemantics.class,
+    JdoByteIdValueSemantics.class,
+    JdoCharIdValueSemantics.class,
+    JdoStringIdValueSemantics.class,
+    JdoObjectIdValueSemantics.class,
 
     // @Mixin's
     Persistable_datanucleusVersionLong.class,
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
index 426a9eeea6..45f987cd2e 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
@@ -156,7 +156,7 @@ implements EntityFacet {
             val primaryKeyType = primaryKeyTypeFor(entityClass);
 
             val idStringifier = 
idStringifierLookupService.lookupElseFail(primaryKeyType);
-            val primaryKey = _Casts.castTo(IdStringifier.Abstract.class, 
idStringifier)
+            val primaryKey = 
_Casts.castTo(IdStringifier.SupportingTargetEntityClass.class, idStringifier)
                     
.map(stringifier->stringifier.destring(bookmark.getIdentifier(), entityClass))
                     
.orElseGet(()->idStringifier.destring(bookmark.getIdentifier()));
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/applib/ByteArrayBlobRdbmsMapping.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
similarity index 99%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/applib/ByteArrayBlobRdbmsMapping.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
index 279a601193..6e64d997b3 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/applib/ByteArrayBlobRdbmsMapping.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/ByteArrayBlobRdbmsMapping.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.valuemappings.applib;
+package org.apache.isis.persistence.jdo.datanucleus.valuemappings;
 
 import org.datanucleus.store.rdbms.RDBMSStoreManager;
 import org.datanucleus.store.rdbms.mapping.column.BlobColumnMapping;
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/applib/IsisBlobMapping.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/IsisBlobMapping.java
similarity index 98%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/applib/IsisBlobMapping.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/IsisBlobMapping.java
index 5a889c141f..80082ae3de 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/applib/IsisBlobMapping.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/IsisBlobMapping.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.valuetypes.applib;
+package org.apache.isis.persistence.jdo.datanucleus.valuemappings;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/applib/IsisClobMapping.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/IsisClobMapping.java
similarity index 98%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/applib/IsisClobMapping.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/IsisClobMapping.java
index d56a2214bd..f670379a99 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/applib/IsisClobMapping.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuemappings/IsisClobMapping.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.valuetypes.applib;
+package org.apache.isis.persistence.jdo.datanucleus.valuemappings;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdValueSemantics.java
similarity index 79%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdValueSemantics.java
index 0443d90324..cf7c11e0e0 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
@@ -24,15 +24,16 @@ import org.datanucleus.identity.ByteId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForByteId extends IdStringifier.Abstract<ByteId> {
+public class JdoByteIdValueSemantics
+extends ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ByteId> 
{
 
-    public IdStringifierForByteId() {
+    public JdoByteIdValueSemantics() {
         super(ByteId.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteIdentity.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
similarity index 79%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteIdentity.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
index 219ccce367..fca3e71379 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteIdentity.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 import javax.jdo.identity.ByteIdentity;
@@ -24,15 +24,16 @@ import javax.jdo.identity.ByteIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForByteIdentity extends 
IdStringifier.Abstract<ByteIdentity> {
+public class JdoByteIdentityValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ByteIdentity> {
 
-    public IdStringifierForByteIdentity() {
+    public JdoByteIdentityValueSemantics() {
         super(ByteIdentity.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForCharId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdValueSemantics.java
similarity index 81%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForCharId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdValueSemantics.java
index 9835a2641f..8869d8e56e 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForCharId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
@@ -26,6 +26,7 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -33,11 +34,12 @@ import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForCharId extends IdStringifier.Abstract<CharId> {
+public class JdoCharIdValueSemantics
+extends ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<CharId> 
{
 
     @Inject IdStringifier<Character> idStringifierForCharacter;
 
-    public IdStringifierForCharId() {
+    public JdoCharIdValueSemantics() {
         super(CharId.class);
     }
 
@@ -45,7 +47,7 @@ public class IdStringifierForCharId extends 
IdStringifier.Abstract<CharId> {
      * for testing only
      */
     @Builder
-    IdStringifierForCharId(final IdStringifier<Character> 
idStringifierForCharacter) {
+    JdoCharIdValueSemantics(final IdStringifier<Character> 
idStringifierForCharacter) {
         this();
         this.idStringifierForCharacter = idStringifierForCharacter;
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForCharIdentity.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
similarity index 81%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForCharIdentity.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
index 3ce97b71b6..257a8f9a57 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForCharIdentity.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
@@ -26,6 +26,7 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -33,11 +34,12 @@ import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForCharIdentity extends 
IdStringifier.Abstract<CharIdentity> {
+public class JdoCharIdentityValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<CharIdentity> {
 
     @Inject IdStringifier<Character> idStringifierForCharacter;
 
-    public IdStringifierForCharIdentity() {
+    public JdoCharIdentityValueSemantics() {
         super(CharIdentity.class);
     }
 
@@ -45,7 +47,7 @@ public class IdStringifierForCharIdentity extends 
IdStringifier.Abstract<CharIde
      * for testing only
      */
     @Builder
-    IdStringifierForCharIdentity(final IdStringifier<Character> 
idStringifierForCharacter) {
+    JdoCharIdentityValueSemantics(final IdStringifier<Character> 
idStringifierForCharacter) {
         this();
         this.idStringifierForCharacter = idStringifierForCharacter;
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreIdImpl.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdImplValueSemantics.java
similarity index 84%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreIdImpl.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdImplValueSemantics.java
index de6449efd9..b8994d3186 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreIdImpl.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdImplValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
@@ -24,7 +24,7 @@ import org.datanucleus.identity.DatastoreIdImpl;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 import lombok.SneakyThrows;
@@ -32,11 +32,12 @@ import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForDatastoreIdImpl extends 
IdStringifier.Abstract<DatastoreIdImpl> {
+public class JdoDatastoreIdImplValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<DatastoreIdImpl> 
{
 
     public static final String STRING_DELIMITER = "[OID]"; // as
 
-    public IdStringifierForDatastoreIdImpl() {
+    public JdoDatastoreIdImplValueSemantics() {
         super(DatastoreIdImpl.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
similarity index 82%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
index 628998c2fd..7f154a029d 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import java.lang.reflect.Constructor;
 
@@ -28,6 +28,7 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.context._Context;
 
@@ -36,9 +37,10 @@ import lombok.SneakyThrows;
 
 @Component
 @Priority(PriorityPrecedence.LATE + 100) // after the implementations of 
DatastoreId; for a custom impl.
-public class IdStringifierForDatastoreId extends 
IdStringifier.Abstract<DatastoreId> {
+public class JdoDatastoreIdValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<DatastoreId> {
 
-    public IdStringifierForDatastoreId() {
+    public JdoDatastoreIdValueSemantics() {
         super(DatastoreId.class);
     }
 
@@ -49,7 +51,7 @@ public class IdStringifierForDatastoreId extends 
IdStringifier.Abstract<Datastor
         // re-create-able through the constructor
         //
         // to do this, we also need to capture the class of the Id value class 
itself, followed by the value (as a string)
-        return value.getClass().getName() + SEPARATOR + value.toString();
+        return value.getClass().getName() + IdStringifier.Abstract.SEPARATOR + 
value.toString();
     }
 
     @SneakyThrows
@@ -57,7 +59,7 @@ public class IdStringifierForDatastoreId extends 
IdStringifier.Abstract<Datastor
     public DatastoreId destring(
             final @NonNull String stringified,
             final @Nullable Class<?> targetEntityClass) {
-        int idx = stringified.indexOf(SEPARATOR);
+        int idx = stringified.indexOf(IdStringifier.Abstract.SEPARATOR);
         String clsName = stringified.substring(0, idx);
         String keyStr = stringified.substring(idx + 1);
         final Class<?> cls = _Context.loadClass(clsName);
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreUniqueLongId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreUniqueLongIdValueSemantics.java
similarity index 80%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreUniqueLongId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreUniqueLongIdValueSemantics.java
index b56d1a6ed2..66b571c3b1 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForDatastoreUniqueLongId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreUniqueLongIdValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
@@ -25,16 +25,17 @@ import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 import lombok.SneakyThrows;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForDatastoreUniqueLongId extends 
IdStringifier.Abstract<DatastoreUniqueLongId> {
+public class JdoDatastoreUniqueLongIdValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<DatastoreUniqueLongId>
 {
 
-    public IdStringifierForDatastoreUniqueLongId() {
+    public JdoDatastoreUniqueLongIdValueSemantics() {
         super(DatastoreUniqueLongId.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdValueSemantics.java
similarity index 79%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdValueSemantics.java
index 13285c40f6..1591d54010 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdValueSemantics.java
@@ -16,24 +16,24 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
-import javax.jdo.identity.IntIdentity;
 
 import org.datanucleus.identity.IntId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForIntId extends IdStringifier.Abstract<IntId> {
+public class JdoIntIdValueSemantics
+extends ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<IntId> {
 
-    public IdStringifierForIntId() {
+    public JdoIntIdValueSemantics() {
         super(IntId.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntIdentity.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
similarity index 79%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntIdentity.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
index 5a849f4d12..ce12f28ae8 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntIdentity.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 import javax.jdo.identity.IntIdentity;
@@ -24,15 +24,16 @@ import javax.jdo.identity.IntIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForIntIdentity extends 
IdStringifier.Abstract<IntIdentity> {
+public class JdoIntIdentityValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<IntIdentity> {
 
-    public IdStringifierForIntIdentity() {
+    public JdoIntIdentityValueSemantics() {
         super(IntIdentity.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdValueSemantics.java
similarity index 79%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdValueSemantics.java
index e58dcb237c..23efa2f5fc 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdValueSemantics.java
@@ -16,24 +16,24 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
-import javax.jdo.identity.LongIdentity;
 
 import org.datanucleus.identity.LongId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForLongId extends IdStringifier.Abstract<LongId> {
+public class JdoLongIdValueSemantics
+extends ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<LongId> 
{
 
-    public IdStringifierForLongId() {
+    public JdoLongIdValueSemantics() {
         super(LongId.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongIdentity.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
similarity index 79%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongIdentity.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
index c288e61829..74dc4cec98 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongIdentity.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 import javax.jdo.identity.LongIdentity;
@@ -24,15 +24,16 @@ import javax.jdo.identity.LongIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForLongIdentity extends 
IdStringifier.Abstract<LongIdentity> {
+public class JdoLongIdentityValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<LongIdentity> {
 
-    public IdStringifierForLongIdentity() {
+    public JdoLongIdentityValueSemantics() {
         super(LongIdentity.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForObjectId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdValueSemantics.java
similarity index 89%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForObjectId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdValueSemantics.java
index b2448bbb38..2a706818eb 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForObjectId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import java.util.UUID;
 
@@ -26,7 +26,7 @@ import org.datanucleus.identity.ObjectId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -42,13 +42,14 @@ import lombok.NonNull;
 @Component
 @Priority(PriorityPrecedence.LATE)
 @Builder
-public class IdStringifierForObjectId extends IdStringifier.Abstract<ObjectId> 
{
+public class JdoObjectIdValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ObjectId> {
 
     private static final String PREFIX_UUID = "u_";
     private static final String PREFIX_LONG = "l_";
     private static final String PREFIX_INT = "i_";
 
-    public IdStringifierForObjectId() {
+    public JdoObjectIdValueSemantics() {
         super(ObjectId.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForObjectIdentity.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
similarity index 89%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForObjectIdentity.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
index c14a4afdd0..93f01efcc4 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForObjectIdentity.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import java.util.UUID;
 
@@ -26,7 +26,7 @@ import javax.jdo.identity.ObjectIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -42,13 +42,14 @@ import lombok.NonNull;
 @Component
 @Priority(PriorityPrecedence.LATE)
 @Builder
-public class IdStringifierForObjectIdentity extends 
IdStringifier.Abstract<ObjectIdentity> {
+public class JdoObjectIdentityValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ObjectIdentity> {
 
     private static final String PREFIX_UUID = "u_";
     private static final String PREFIX_LONG = "l_";
     private static final String PREFIX_INT = "i_";
 
-    public IdStringifierForObjectIdentity() {
+    public JdoObjectIdentityValueSemantics() {
         super(ObjectIdentity.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdValueSemantics.java
similarity index 79%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdValueSemantics.java
index f84d5cf027..bee54b5430 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdValueSemantics.java
@@ -16,24 +16,24 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
-import javax.jdo.identity.ShortIdentity;
 
 import org.datanucleus.identity.ShortId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForShortId extends IdStringifier.Abstract<ShortId> {
+public class JdoShortIdValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ShortId> {
 
-    public IdStringifierForShortId() {
+    public JdoShortIdValueSemantics() {
         super(ShortId.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortIdentity.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
similarity index 79%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortIdentity.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
index 01929e2e57..0d432f515f 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortIdentity.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 import javax.jdo.identity.ShortIdentity;
@@ -24,15 +24,16 @@ import javax.jdo.identity.ShortIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForShortIdentity extends 
IdStringifier.Abstract<ShortIdentity> {
+public class JdoShortIdentityValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ShortIdentity> {
 
-    public IdStringifierForShortIdentity() {
+    public JdoShortIdentityValueSemantics() {
         super(ShortIdentity.class);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForStringIdentity.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdValueSemantics.java
similarity index 81%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForStringIdentity.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdValueSemantics.java
index b10991ae3a..bdc1bb6f7c 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForStringIdentity.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
@@ -26,6 +26,7 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -33,11 +34,12 @@ import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForStringIdentity extends 
IdStringifier.Abstract<StringIdentity> {
+public class JdoStringIdValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<StringIdentity> {
 
     @Inject IdStringifier<String> idStringifierForString;
 
-    public IdStringifierForStringIdentity() {
+    public JdoStringIdValueSemantics() {
         super(StringIdentity.class);
     }
 
@@ -45,7 +47,7 @@ public class IdStringifierForStringIdentity extends 
IdStringifier.Abstract<Strin
      * for testing only
      */
     @Builder
-    IdStringifierForStringIdentity(final IdStringifier<String> 
idStringifierForString) {
+    JdoStringIdValueSemantics(final IdStringifier<String> 
idStringifierForString) {
         this();
         this.idStringifierForString = idStringifierForString;
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForStringId.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
similarity index 81%
rename from 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForStringId.java
rename to 
persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
index cfcd09b637..7a3b23de0f 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForStringId.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity;
+package org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
@@ -26,6 +26,7 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -33,11 +34,12 @@ import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForStringId extends 
IdStringifier.Abstract<StringIdentity> {
+public class JdoStringIdentityValueSemantics
+extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<StringIdentity> {
 
     @Inject IdStringifier<String> idStringifierForString;
 
-    public IdStringifierForStringId() {
+    public JdoStringIdentityValueSemantics() {
         super(StringIdentity.class);
     }
 
@@ -45,7 +47,7 @@ public class IdStringifierForStringId extends 
IdStringifier.Abstract<StringIdent
      * for testing only
      */
     @Builder
-    IdStringifierForStringId(final IdStringifier<String> 
idStringifierForString) {
+    JdoStringIdentityValueSemantics(final IdStringifier<String> 
idStringifierForString) {
         this();
         this.idStringifierForString = idStringifierForString;
     }
diff --git a/persistence/jdo/datanucleus/src/main/resources/plugin.xml 
b/persistence/jdo/datanucleus/src/main/resources/plugin.xml
index 8c9538f5cd..8b58294534 100644
--- a/persistence/jdo/datanucleus/src/main/resources/plugin.xml
+++ b/persistence/jdo/datanucleus/src/main/resources/plugin.xml
@@ -28,10 +28,10 @@
     <extension point="org.datanucleus.store.rdbms.java_mapping">
         <mapping
             java-type="org.apache.isis.applib.value.Blob"
-            
mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuetypes.applib.IsisBlobMapping"/>
+            
mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuemappings.IsisBlobMapping"/>
         <mapping
             java-type="org.apache.isis.applib.value.Clob"
-            
mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuetypes.applib.IsisClobMapping"/>
+            
mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuemappings.IsisClobMapping"/>
 
     </extension>
 
@@ -45,14 +45,14 @@
                 jdbc-type="BLOB"
                 sql-type="BLOB"
                 default="true"
-                
column-mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuemappings.applib.ByteArrayBlobRdbmsMapping">
+                
column-mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuemappings.ByteArrayBlobRdbmsMapping">
         </mapping>
         <mapping
                 java-type="[Ljava.lang.Byte;"
                 jdbc-type="BLOB"
                 sql-type="BLOB"
                 default="true"
-                
column-mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuemappings.applib.ByteArrayBlobRdbmsMapping">
+                
column-mapping-class="org.apache.isis.persistence.jdo.datanucleus.valuemappings.ByteArrayBlobRdbmsMapping">
         </mapping>
     </extension>
 
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForByteIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForByteIdentity_Test.java
index 057070cbb9..83a584bb27 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForByteIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForByteIdentity_Test.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForByteIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoByteIdentityValueSemantics;
 
 import lombok.val;
 
@@ -53,7 +53,7 @@ class IdStringifierForByteIdentity_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = new IdStringifierForByteIdentity();
+        val stringifier = new JdoByteIdentityValueSemantics();
 
         val stringified = stringifier.enstring(new ByteIdentity(entityType, 
value));
         val parse = stringifier.destring(stringified, entityType);
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForCharIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForCharIdentity_Test.java
index 0e7ec6b3e1..fed3793f7d 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForCharIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForCharIdentity_Test.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.params.provider.MethodSource;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.isis.core.metamodel.valuesemantics.CharacterValueSemantics;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForCharIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoCharIdentityValueSemantics;
 
 import lombok.val;
 
@@ -71,7 +71,7 @@ class IdStringifierForCharIdentity_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = IdStringifierForCharIdentity.builder()
+        val stringifier = JdoCharIdentityValueSemantics.builder()
                 .idStringifierForCharacter(new CharacterValueSemantics())
                 .build();
 
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreIdImpl_long_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreIdImpl_long_Test.java
index 8669249b07..4560813f0c 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreIdImpl_long_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreIdImpl_long_Test.java
@@ -28,7 +28,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreIdImpl;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdImplValueSemantics;
 
 import lombok.val;
 
@@ -52,7 +52,7 @@ class IdStringifierForDatastoreId_DatastoreIdImpl_long_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = new IdStringifierForDatastoreIdImpl();
+        val stringifier = new JdoDatastoreIdImplValueSemantics();
 
         val stringified = stringifier.enstring(new 
DatastoreIdImpl(entityType.getName(), value));
         if(enstringed != null) {
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test.java
index 192cb82727..55e99fbe21 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test.java
@@ -28,8 +28,8 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreIdImpl;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreUniqueLongId;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdImplValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreUniqueLongIdValueSemantics;
 
 import lombok.val;
 
@@ -53,7 +53,7 @@ class 
IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = new IdStringifierForDatastoreUniqueLongId();
+        val stringifier = new JdoDatastoreUniqueLongIdValueSemantics();
 
         val stringified = stringifier.enstring(new 
DatastoreUniqueLongId(value));
         val parse = stringifier.destring(stringified, null); // no need to 
pass entityType
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test.java
index 6cceb3b0fc..a00597b760 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test.java
@@ -28,8 +28,8 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreIdImpl;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForDatastoreUniqueLongId;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdImplValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreUniqueLongIdValueSemantics;
 
 import lombok.val;
 
@@ -54,7 +54,7 @@ class 
IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test {
         val entityType = Customer.class;
 
         String strValue = "" + value;
-        val stringifier = new IdStringifierForDatastoreUniqueLongId();
+        val stringifier = new JdoDatastoreUniqueLongIdValueSemantics();
 
         val stringified = stringifier.enstring(new 
DatastoreUniqueLongId(strValue));
         val parse = stringifier.destring(stringified, null); // no need to 
pass entityType
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntId_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntId_Test.java
index ca67d1f9c7..8980a8e0e5 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntId_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntId_Test.java
@@ -30,8 +30,8 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForIntId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForIntIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoIntIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoIntIdentityValueSemantics;
 
 import lombok.val;
 
@@ -55,7 +55,7 @@ class IdStringifierForIntId_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = new IdStringifierForIntId();
+        val stringifier = new JdoIntIdValueSemantics();
 
         val stringified = stringifier.enstring(new IntId(entityType, value));
         val parse = stringifier.destring(stringified, entityType);
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntIdentity_Test.java
index bd684bfb3c..51eeaac7d3 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntIdentity_Test.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForIntIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoIntIdentityValueSemantics;
 
 import lombok.val;
 
@@ -53,7 +53,7 @@ class IdStringifierForIntIdentity_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = new IdStringifierForIntIdentity();
+        val stringifier = new JdoIntIdentityValueSemantics();
 
         val stringified = stringifier.enstring(new IntIdentity(entityType, 
value));
         val parse = stringifier.destring(stringified, entityType);
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongId_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongId_Test.java
index 7e7c59f2a5..bef3968e01 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongId_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongId_Test.java
@@ -30,8 +30,8 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForLongId;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForLongIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoLongIdValueSemantics;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoLongIdentityValueSemantics;
 
 import lombok.val;
 
@@ -55,7 +55,7 @@ class IdStringifierForLongId_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = new IdStringifierForLongId();
+        val stringifier = new JdoLongIdValueSemantics();
 
         val stringified = stringifier.enstring(new LongId(entityType, value));
         val parse = stringifier.destring(stringified, entityType);
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongIdentity_Test.java
index 1bd80c9070..9ba0455f7b 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongIdentity_Test.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForLongIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoLongIdentityValueSemantics;
 
 import lombok.val;
 
@@ -53,7 +53,7 @@ class IdStringifierForLongIdentity_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = new IdStringifierForLongIdentity();
+        val stringifier = new JdoLongIdentityValueSemantics();
 
         val stringified = stringifier.enstring(new LongIdentity(entityType, 
value));
         val parse = stringifier.destring(stringified, entityType);
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForObjectIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForObjectIdentity_Test.java
index ad09b47905..5072e3ab38 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForObjectIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForObjectIdentity_Test.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForObjectIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoObjectIdentityValueSemantics;
 
 import lombok.val;
 
@@ -53,7 +53,7 @@ class IdStringifierForObjectIdentity_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = IdStringifierForObjectIdentity.builder().build();
+        val stringifier = JdoObjectIdentityValueSemantics.builder().build();
 
         val stringified = stringifier.enstring(new ObjectIdentity(entityType, 
value));
         val parse = stringifier.destring(stringified, entityType);
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForShortIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForShortIdentity_Test.java
index fa51bf661a..e92dd8630b 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForShortIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForShortIdentity_Test.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForShortIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoShortIdentityValueSemantics;
 
 import lombok.val;
 
@@ -53,7 +53,7 @@ class IdStringifierForShortIdentity_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = new IdStringifierForShortIdentity();
+        val stringifier = new JdoShortIdentityValueSemantics();
 
         val stringified = stringifier.enstring(new ShortIdentity(entityType, 
value));
         val parse = stringifier.destring(stringified, entityType);
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForStringIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForStringIdentity_Test.java
index bea155efbb..9f9421d517 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForStringIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForStringIdentity_Test.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 import org.apache.isis.core.metamodel.valuesemantics.StringValueSemantics;
-import 
org.apache.isis.persistence.jdo.datanucleus.metamodel.facets.entity.IdStringifierForStringIdentity;
+import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoStringIdentityValueSemantics;
 
 import lombok.val;
 
@@ -59,7 +59,7 @@ class IdStringifierForStringIdentity_Test {
 
         val entityType = Customer.class;
 
-        val stringifier = IdStringifierForStringIdentity.builder()
+        val stringifier = JdoStringIdentityValueSemantics.builder()
                 .idStringifierForString(new StringValueSemantics()).build();
 
         val stringified = stringifier.enstring(new StringIdentity(entityType, 
value));
diff --git 
a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/entity/JpaEntityFacet.java
 
b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/entity/JpaEntityFacet.java
index 74138f2944..123e9c77c9 100644
--- 
a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/entity/JpaEntityFacet.java
+++ 
b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/entity/JpaEntityFacet.java
@@ -122,7 +122,7 @@ public class JpaEntityFacet
         log.debug("fetchEntity; bookmark={}", bookmark);
 
         val idStringifier = lookupIdStringifier(getPrimaryKeyType());
-        val primaryKey = _Casts.castTo(IdStringifier.Abstract.class, 
idStringifier)
+        val primaryKey = 
_Casts.castTo(IdStringifier.SupportingTargetEntityClass.class, idStringifier)
                 
.map(stringifier->stringifier.destring(bookmark.getIdentifier(), entityClass))
                 
.orElseGet(()->idStringifier.destring(bookmark.getIdentifier()));
 

Reply via email to