You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/01/15 13:27:32 UTC

[isis] branch master updated: ISIS-2480: adds some metamodel facets for JPA

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 3adb6c3  ISIS-2480: adds some metamodel facets for JPA
3adb6c3 is described below

commit 3adb6c3d5c53c32be3550884ce39789a0a848c68
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jan 15 14:27:17 2021 +0100

    ISIS-2480: adds some metamodel facets for JPA
    
    also autodetect bean type for JPA entities during initial bean scanning
---
 .../config/beans/IsisBeanTypeClassifierImpl.java   |  6 +++
 .../JdoPersistenceCapableFacetAnnotation.java      |  2 +-
 .../JdoPersistenceCapableFacetImpl.java            | 36 --------------
 .../column/MandatoryFacetDerivedFromJdoColumn.java |  2 +-
 .../JdoNotPersistentFacetAnnotation.java           |  2 +-
 .../prop/notpersistent/JdoNotPersistentFacet.java  |  6 +--
 .../metamodel/JpaEntityFacetFactory.java           | 10 ++--
 .../integration/metamodel/JpaProgrammingModel.java |  5 +-
 .../jpa/metamodel/JpaProgrammingModel.java         | 11 +++--
 .../column/MandatoryFacetDerivedFromJpaColumn.java | 17 +++++++
 ...ndatoryFromJpaColumnAnnotationFacetFactory.java | 55 ++++++++++++++++++++++
 .../transients/JpaTransientAnnotationFacet.java}   | 11 +++--
 .../JpaTransientAnnotationFacetFactory.java        | 52 ++++++++++++++++++++
 .../facets/prop/transients/JpaTransientFacet.java} | 11 ++---
 .../isis/testdomain/jpa/entities/JpaBook.java      |  2 -
 .../isis/testdomain/jpa/entities/JpaInventory.java |  2 -
 .../isis/testdomain/jpa/entities/JpaProduct.java   |  5 +-
 .../testdomain/jpa/entities/JpaProductComment.java |  4 +-
 .../isis/testdomain/jpa/springdata/Employee.java   |  6 +--
 19 files changed, 162 insertions(+), 83 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierImpl.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierImpl.java
index 4b86aa1..f0572ab 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierImpl.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierImpl.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.Collection;
 
 import javax.enterprise.inject.Vetoed;
+import javax.persistence.Entity;
 
 import org.springframework.stereotype.Component;
 
@@ -72,6 +73,11 @@ implements IsisBeanTypeClassifier {
             return BeanClassification.selfManaged(BeanSort.VIEW_MODEL);
         }
 
+        val entityAnnotation = findNearestAnnotation(type, Entity.class).orElse(null);
+        if(entityAnnotation!=null) {
+            return BeanClassification.selfManaged(BeanSort.ENTITY);
+        }
+        
         val aDomainObject = findNearestAnnotation(type, DomainObject.class).orElse(null);
         if(aDomainObject!=null) {
             switch (aDomainObject.nature()) {
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAnnotation.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAnnotation.java
index 92567f9..a3fb740 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAnnotation.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAnnotation.java
@@ -22,7 +22,7 @@ import javax.jdo.annotations.IdentityType;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class JdoPersistenceCapableFacetAnnotation extends JdoPersistenceCapableFacetImpl {
+public class JdoPersistenceCapableFacetAnnotation extends JdoPersistenceCapableFacetAbstract {
 
     public JdoPersistenceCapableFacetAnnotation(
             final String schemaName,
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
deleted file mode 100644
index f7e28ce..0000000
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.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.isis.persistence.jdo.metamodel.facets.object.persistencecapable;
-
-import javax.jdo.annotations.IdentityType;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-public class JdoPersistenceCapableFacetImpl extends JdoPersistenceCapableFacetAbstract {
-
-    public JdoPersistenceCapableFacetImpl(
-            final String schemaName,
-            final String tableOrTypeName,
-            final IdentityType identityType,
-            final FacetHolder holder) {
-        super(schemaName, tableOrTypeName, identityType, holder);
-    }
-
-
-}
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFacetDerivedFromJdoColumn.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFacetDerivedFromJdoColumn.java
index 2b26759..7fab184 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFacetDerivedFromJdoColumn.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFacetDerivedFromJdoColumn.java
@@ -28,7 +28,7 @@ import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFace
 public class MandatoryFacetDerivedFromJdoColumn extends MandatoryFacetAbstract {
 
 
-    public MandatoryFacetDerivedFromJdoColumn(final FacetHolder holder, boolean required ) {
+    public MandatoryFacetDerivedFromJdoColumn(final FacetHolder holder, final boolean required) {
         super(holder, Semantics.of(required));
     }
 
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetAnnotation.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetAnnotation.java
index 3ce3935..a687b3d 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetAnnotation.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetAnnotation.java
@@ -21,7 +21,7 @@ package org.apache.isis.persistence.jdo.metamodel.facets.prop.notpersistent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 
-public class JdoNotPersistentFacetAnnotation extends JdoNotPersistentFacetImpl {
+public class JdoNotPersistentFacetAnnotation extends JdoNotPersistentFacetAbstract {
 
     public JdoNotPersistentFacetAnnotation(final FacetHolder holder) {
         super(holder);
diff --git a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/prop/notpersistent/JdoNotPersistentFacet.java b/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/prop/notpersistent/JdoNotPersistentFacet.java
index 0e296f5..e1891eb 100644
--- a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/prop/notpersistent/JdoNotPersistentFacet.java
+++ b/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/prop/notpersistent/JdoNotPersistentFacet.java
@@ -18,16 +18,16 @@
  */
 package org.apache.isis.persistence.jdo.provider.metamodel.facets.prop.notpersistent;
 
-import javax.jdo.annotations.PrimaryKey;
+import javax.jdo.annotations.NotPersistent;
 
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 
 /**
- * Corresponds to the property with the {@link PrimaryKey} annotation.
+ * Corresponds to the property with the {@link NotPersistent} annotation.
  * <p>
- * The JDO {@link PrimaryKey} annotation is used internally the JDO object store to
+ * The JDO {@link NotPersistent} annotation is used internally the JDO object store to
  * create the {@link Oid}.
  */
 public interface JdoNotPersistentFacet extends Facet {
diff --git a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
index a46338a..b31a913 100644
--- a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
@@ -45,7 +45,6 @@ import org.apache.isis.commons.internal.memento._Mementos.SerializingAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -64,13 +63,14 @@ public class JpaEntityFacetFactory extends FacetFactoryAbstract {
     @Override
     public void process(ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
-
-        val entityAnnotation = Annotations.getAnnotation(cls, Entity.class);
-        if (entityAnnotation == null) {
+        
+        val facetHolder = processClassContext.getFacetHolder();
+        
+        val entityAnnotation = processClassContext.synthesizeOnType(Entity.class);
+        if(!entityAnnotation.isPresent()) {
             return;
         }
         
-        val facetHolder = processClassContext.getFacetHolder();
         val serviceRegistry = super.getMetaModelContext().getServiceRegistry();
         val jpaEntityFacet = new JpaEntityFacet(facetHolder, cls, serviceRegistry);
             
diff --git a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaProgrammingModel.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaProgrammingModel.java
index 2daf77f..0c6f754 100644
--- a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaProgrammingModel.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaProgrammingModel.java
@@ -18,11 +18,8 @@
  */
 package org.apache.isis.persistence.jpa.integration.metamodel;
 
-import javax.inject.Inject;
-
 import org.springframework.stereotype.Component;
 
-import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel.Marker;
@@ -32,7 +29,7 @@ import lombok.val;
 @Component
 public class JpaProgrammingModel implements MetaModelRefiner {
     
-    @Inject private IsisConfiguration config;
+    // @Inject private IsisConfiguration config;
 
     @Override
     public void refineProgrammingModel(ProgrammingModel pm) {
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/JpaProgrammingModel.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/JpaProgrammingModel.java
index 4656430..f1c8970 100644
--- a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/JpaProgrammingModel.java
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/JpaProgrammingModel.java
@@ -22,6 +22,9 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModel.Marker;
+import org.apache.isis.persistence.jpa.metamodel.facets.prop.column.MandatoryFromJpaColumnAnnotationFacetFactory;
+import org.apache.isis.persistence.jpa.metamodel.facets.prop.transients.JpaTransientAnnotationFacetFactory;
 
 import lombok.val;
 
@@ -33,7 +36,7 @@ public class JpaProgrammingModel implements MetaModelRefiner {
     @Override
     public void refineProgrammingModel(ProgrammingModel pm) {
 
-        val step1 = ProgrammingModel.FacetProcessingOrder.C2_AFTER_METHOD_REMOVING;
+//        val step1 = ProgrammingModel.FacetProcessingOrder.C2_AFTER_METHOD_REMOVING;
 //
 //        // come what may, we have to ignore the PersistenceCapable supertype.
 //        pm.addFactory(step1, RemoveJdoEnhancementTypesFacetFactory.class, Marker.JDO);
@@ -45,8 +48,8 @@ public class JpaProgrammingModel implements MetaModelRefiner {
 
 
         val step2 = ProgrammingModel.FacetProcessingOrder.A2_AFTER_FALLBACK_DEFAULTS;
-//
-//        pm.addFactory(step2, JdoPersistenceCapableAnnotationFacetFactory.class, Marker.JDO);
+
+        pm.addFactory(step2, JpaTransientAnnotationFacetFactory.class, Marker.JPA);
 //        pm.addFactory(step2, JdoDatastoreIdentityAnnotationFacetFactory.class, Marker.JDO);
 //
 //        pm.addFactory(step2, JdoPrimaryKeyAnnotationFacetFactory.class, Marker.JDO);
@@ -61,7 +64,7 @@ public class JpaProgrammingModel implements MetaModelRefiner {
 //        // must appear after JdoPrimaryKeyAnnotationFacetFactory (above)
 //        // and also MandatoryFacetOnPropertyMandatoryAnnotationFactory
 //        // and also PropertyAnnotationFactory
-//        pm.addFactory(step2, MandatoryFromJdoColumnAnnotationFacetFactory.class, Marker.JDO);
+        pm.addFactory(step2, MandatoryFromJpaColumnAnnotationFacetFactory.class, Marker.JPA);
 //
 //
 //        // -- validators
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MandatoryFacetDerivedFromJpaColumn.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MandatoryFacetDerivedFromJpaColumn.java
new file mode 100644
index 0000000..4529614
--- /dev/null
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MandatoryFacetDerivedFromJpaColumn.java
@@ -0,0 +1,17 @@
+package org.apache.isis.persistence.jpa.metamodel.facets.prop.column;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacetAbstract;
+
+/**
+ * Derived by presence of an <tt>@Column</tt> method.
+ */
+public class MandatoryFacetDerivedFromJpaColumn extends MandatoryFacetAbstract {
+
+
+    public MandatoryFacetDerivedFromJpaColumn(final FacetHolder holder, final boolean required) {
+        super(holder, Semantics.of(required));
+    }
+
+
+}
\ No newline at end of file
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MandatoryFromJpaColumnAnnotationFacetFactory.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MandatoryFromJpaColumnAnnotationFacetFactory.java
new file mode 100644
index 0000000..01afd37
--- /dev/null
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/column/MandatoryFromJpaColumnAnnotationFacetFactory.java
@@ -0,0 +1,55 @@
+/*
+ *  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.isis.persistence.jpa.metamodel.facets.prop.column;
+
+import javax.persistence.Column;
+
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+
+import lombok.val;
+
+public class MandatoryFromJpaColumnAnnotationFacetFactory
+extends FacetFactoryAbstract {
+
+    public MandatoryFromJpaColumnAnnotationFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+
+        //val cls = processMethodContext.getCls();
+
+        final Column annotation = processMethodContext.synthesizeOnMethod(Column.class)
+                .orElse(null);
+
+        if (annotation == null) {
+            return;
+        }
+        
+        val facetHolder = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new MandatoryFacetDerivedFromJpaColumn(
+                facetHolder,
+                !annotation.nullable()));
+    }
+    
+    
+}
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetImpl.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientAnnotationFacet.java
similarity index 74%
copy from persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetImpl.java
copy to persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientAnnotationFacet.java
index b4086da..1f70861 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetImpl.java
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientAnnotationFacet.java
@@ -16,15 +16,16 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.metamodel.facets.prop.notpersistent;
+package org.apache.isis.persistence.jpa.metamodel.facets.prop.transients;
 
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
+public class JpaTransientAnnotationFacet 
+extends FacetAbstract {
 
-public class JdoNotPersistentFacetImpl extends JdoNotPersistentFacetAbstract {
-
-    public JdoNotPersistentFacetImpl(final FacetHolder holder) {
-        super(holder);
+    protected JpaTransientAnnotationFacet(FacetHolder holder) {
+        super(JpaTransientFacet.class, holder);
     }
 
 }
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientAnnotationFacetFactory.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientAnnotationFacetFactory.java
new file mode 100644
index 0000000..d13e877
--- /dev/null
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientAnnotationFacetFactory.java
@@ -0,0 +1,52 @@
+/*
+ *  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.isis.persistence.jpa.metamodel.facets.prop.transients;
+
+import javax.persistence.Transient;
+
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+
+public class JpaTransientAnnotationFacetFactory
+extends FacetFactoryAbstract {
+
+    public JpaTransientAnnotationFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY);
+    }
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        //val cls = processMethodContext.getCls();
+
+        final Transient annotation = processMethodContext.synthesizeOnMethod(Transient.class)
+                .orElse(null);
+
+        if (annotation == null) {
+            return;
+        }
+
+        final FacetedMethod holder = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new JpaTransientAnnotationFacet(holder));
+    }
+
+    
+}
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetImpl.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientFacet.java
similarity index 72%
rename from persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetImpl.java
rename to persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientFacet.java
index b4086da..9e9bc6f 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/notpersistent/JdoNotPersistentFacetImpl.java
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/facets/prop/transients/JpaTransientFacet.java
@@ -16,15 +16,10 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.metamodel.facets.prop.notpersistent;
+package org.apache.isis.persistence.jpa.metamodel.facets.prop.transients;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.Facet;
 
-
-public class JdoNotPersistentFacetImpl extends JdoNotPersistentFacetAbstract {
-
-    public JdoNotPersistentFacetImpl(final FacetHolder holder) {
-        super(holder);
-    }
+public interface JpaTransientFacet extends Facet {
 
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java
index 6767119..33ef8e0 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java
@@ -26,7 +26,6 @@ import javax.persistence.EntityListeners;
 import javax.persistence.Transient;
 
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.persistence.jpa.applib.integration.JpaEntityInjectionPointResolver;
@@ -46,7 +45,6 @@ import lombok.extern.log4j.Log4j2;
 @DiscriminatorValue("Book")
 @DomainObject(
         objectType = "testdomain.jpa.Book",
-        nature = Nature.ENTITY, //TODO[ISIS-2332] should not be required, when using JPA quick classify SPI 
         entityChangePublishing = Publishing.ENABLED)
 @NoArgsConstructor(access = AccessLevel.PROTECTED)
 @ToString(callSuper = true)
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java
index 579f332..7a9fd8f 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java
@@ -30,7 +30,6 @@ import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Publishing;
 
@@ -43,7 +42,6 @@ import lombok.ToString;
 @Entity
 @DomainObject(
         objectType = "testdomain.jdo.Inventory",
-        nature = Nature.ENTITY, //TODO[2033] should not be required, when using JPA quick classify SPI
         entityChangePublishing = Publishing.ENABLED)
 @NamedQuery(
         name = "JpaInventory.findAffordableProducts", 
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java
index 883e590..be665d6 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java
@@ -36,7 +36,6 @@ import javax.persistence.OneToMany;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Editing;
-import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.commons.internal.base._Strings;
 
@@ -54,9 +53,7 @@ import lombok.ToString;
         name="product_type", 
         discriminatorType = DiscriminatorType.STRING)
 @DomainObject(
-        objectType = "testdomain.jpa.Product",
-        nature = Nature.ENTITY //TODO[2033] should not be required, when using JPA quick classify SPI
-        )
+        objectType = "testdomain.jpa.Product")
 @NoArgsConstructor(access = AccessLevel.PROTECTED)
 @AllArgsConstructor(access = AccessLevel.PROTECTED) 
 @ToString
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
index 0cc4cd0..67bad27 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java
@@ -29,7 +29,6 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.mixins.timestamp.Timestampable;
 
@@ -38,8 +37,7 @@ import lombok.Setter;
 
 @Entity
 @DomainObject(
-        objectType = "testdomain.jpa.ProductComment",
-        nature = Nature.ENTITY) //TODO[ISIS-2332] should not be required, when using JPA quick classify SPI
+        objectType = "testdomain.jpa.ProductComment")
 public class JpaProductComment implements Timestampable {
 
     @Id
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/Employee.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/Employee.java
index 7aa7268..db3d128 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/Employee.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/Employee.java
@@ -18,13 +18,11 @@
  */
 package org.apache.isis.testdomain.jpa.springdata;
 
+import javax.inject.Named;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 
-import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.annotation.Nature;
-
 import lombok.AccessLevel;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
@@ -33,7 +31,7 @@ import lombok.Setter;
 import lombok.ToString;
 
 @Entity
-@DomainObject(nature=Nature.ENTITY, objectType = "testdomain.jpa.springdata.Employee")
+@Named("testdomain.jpa.springdata.Employee")
 @Getter @Setter @ToString @EqualsAndHashCode
 @NoArgsConstructor(access = AccessLevel.PROTECTED)
 public class Employee {