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 2020/12/31 06:31:07 UTC

[isis] branch 2033-Spring_Data_Integration updated: ISIS-2033: remove temporary refactoring helper, fixing some tests

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

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


The following commit(s) were added to refs/heads/2033-Spring_Data_Integration by this push:
     new 9c7bf39  ISIS-2033: remove temporary refactoring helper, fixing some tests
9c7bf39 is described below

commit 9c7bf3922df81f99d8eb8b87aaa356c803545f7a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 31 07:30:50 2020 +0100

    ISIS-2033: remove temporary refactoring helper, fixing some tests
---
 .../jdo/integration/IsisModuleJdoIntegration.java  | 38 +++++++++++--
 .../lifecycles/JdoPersistenceLifecycleService.java | 12 ++--
 .../metamodel/facets/entity/JdoEntityFacet.java    | 55 ++++++++++--------
 .../persistence/FetchResultHandler.java            | 30 ----------
 .../persistence/HasFetchResultHandler.java         | 25 ---------
 .../persistence/HasTransactionalProcessor.java     | 27 ---------
 .../persistence/JdoFetchResultHandler.java         |  4 +-
 .../persistence/JdoPersistenceSession.java         |  4 +-
 .../persistence/JdoPersistenceSession5.java        | 12 +---
 .../persistence/JdoPersistenceSessionFactory.java  | 25 ---------
 .../persistence/JdoPersistenceSessionFactory5.java | 65 ----------------------
 ...actionRollbackTest_usingTransactionService.java | 47 ++++++++--------
 ...TransactionRollbackTest_usingTransactional.java |  6 +-
 .../isis/JdoIsisTransactionScopeListenerTest.java  |  2 +
 ...ollbackTest_usingTransactionalAndFixtures.java} | 64 +++++++--------------
 .../JdoSpringTransactionScopeListenerTest.java     |  7 +--
 16 files changed, 130 insertions(+), 293 deletions(-)

diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/IsisModuleJdoIntegration.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/IsisModuleJdoIntegration.java
index b66820e..9ab6b86 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/IsisModuleJdoIntegration.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/IsisModuleJdoIntegration.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.persistence.jdo.integration;
 
+import javax.inject.Named;
+
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -31,10 +33,10 @@ import org.apache.isis.persistence.jdo.datanucleus.config.DnSettings;
 import org.apache.isis.persistence.jdo.integration.jdosupport.IsisJdoSupportDN5;
 import org.apache.isis.persistence.jdo.integration.lifecycles.JdoPersistenceLifecycleService;
 import org.apache.isis.persistence.jdo.integration.metamodel.JdoIntegrationProgrammingModel;
-import org.apache.isis.persistence.jdo.integration.persistence.JdoPersistenceSessionFactory5;
 import org.apache.isis.persistence.jdo.metamodel.IsisModuleJdoMetamodel;
 import org.apache.isis.persistence.jdo.spring.integration.JdoTransactionManager;
 import org.apache.isis.persistence.jdo.spring.integration.LocalPersistenceManagerFactoryBean;
+import org.apache.isis.persistence.jdo.spring.integration.TransactionAwarePersistenceManagerFactoryProxy;
 
 import lombok.val;
 
@@ -50,17 +52,42 @@ import lombok.val;
         JdoIntegrationProgrammingModel.class,
         
         IsisJdoSupportDN5.class,
-        //IsisPlatformTransactionManagerForJdo.class,
         JdoPersistenceLifecycleService.class,
-        JdoPersistenceSessionFactory5.class,
 
 })
 public class IsisModuleJdoIntegration {
     
+    /**
+     * {@link TransactionAwarePersistenceManagerFactoryProxy} was retired by the Spring Framework, recommended usage is still online [1].
+     * Sources have been recovered from [2].
+     * @see [1] https://docs.spring.io/spring-framework/docs/3.0.0.RC2/reference/html/ch13s04.html
+     * @see [2] https://github.com/spring-projects/spring-framework/tree/2b3445df8134e2b0c4e4a4c4136cbaf9d58b7fc4/spring-orm/src/main/java/org/springframework/orm/jdo
+     */
+    @Bean @Named("transaction-aware-pmf-proxy")
+    public TransactionAwarePersistenceManagerFactoryProxy getTransactionAwarePersistenceManagerFactoryProxy(
+            final LocalPersistenceManagerFactoryBean localPmfBean) {
+        
+        val pmf = localPmfBean.getObject(); // created once per application lifecycle
+        
+        val tapmfProxy = new TransactionAwarePersistenceManagerFactoryProxy();
+        tapmfProxy.setTargetPersistenceManagerFactory(pmf);
+        tapmfProxy.setAllowCreate(false);
+        return tapmfProxy;
+    }
+    
     @Bean 
     public LocalPersistenceManagerFactoryBean getLocalPersistenceManagerFactoryBean(
             final MetaModelContext metaModelContext,
             final DnSettings dnSettings) {
+
+        //final IsisBeanTypeRegistry beanTypeRegistry,
+        // final DnSettings dnSettings,
+        //final List<JdoEntityDiscoveryListener> jdoEntityDiscoveryListeners
+        
+//      _NullSafe.stream(jdoEntityDiscoveryListeners)
+//      .forEach(listener->{
+//          listener.onEntitiesDiscovered(pmf, beanTypeRegistry.getEntityTypesJdo(), dnSettings.getAsMap());    
+//      });
         
         val lpmfBean = new LocalPersistenceManagerFactoryBean();
         lpmfBean.setJdoPropertyMap(dnSettings.getAsProperties());
@@ -69,7 +96,10 @@ public class IsisModuleJdoIntegration {
 
     @Bean @Primary
     public JdoTransactionManager getJdoTransactionManager(LocalPersistenceManagerFactoryBean localPmfBean) {
-        return new JdoTransactionManager(localPmfBean.getObject());
+        
+        val pmf = localPmfBean.getObject(); // created once per application lifecycle
+        
+        return new JdoTransactionManager(pmf);
     }
     
 }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/JdoPersistenceLifecycleService.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/JdoPersistenceLifecycleService.java
index 67a376b..b997178 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/JdoPersistenceLifecycleService.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/lifecycles/JdoPersistenceLifecycleService.java
@@ -40,7 +40,8 @@ import org.apache.isis.core.runtime.events.AppLifecycleEvent;
 import org.apache.isis.persistence.jdo.datanucleus.config.DnSettings;
 import org.apache.isis.persistence.jdo.integration.persistence.DnApplication;
 import org.apache.isis.persistence.jdo.integration.persistence.JdoPersistenceSession;
-import org.apache.isis.persistence.jdo.integration.persistence.JdoPersistenceSessionFactory;
+import org.apache.isis.persistence.jdo.integration.persistence.JdoPersistenceSession5;
+import org.apache.isis.persistence.jdo.spring.integration.TransactionAwarePersistenceManagerFactoryProxy;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -54,12 +55,14 @@ import lombok.extern.log4j.Log4j2;
 public class JdoPersistenceLifecycleService {
 
     @Inject MetaModelContext metaModelContext;
-    @Inject JdoPersistenceSessionFactory persistenceSessionFactory;
+    //@Inject LocalPersistenceManagerFactoryBean localPmfBean;
+    @Inject TransactionAwarePersistenceManagerFactoryProxy txAwarePmfProxy;
+    
     @Inject IsisBeanTypeRegistry isisBeanTypeRegistry;
     @Inject DnSettings dnSettings;
 
     @PostConstruct
-    public void postConstr() {
+    public void init() {
         if(log.isDebugEnabled()) {
             log.debug("init entity types {}", 
                     isisBeanTypeRegistry.getEntityTypesJdo());
@@ -111,8 +114,7 @@ public class JdoPersistenceLifecycleService {
     // -- HELPER
 
     private void onInteractionStarted(final InteractionSession interactionSession) {
-        val persistenceSession =
-                persistenceSessionFactory.createPersistenceSession();
+        val persistenceSession = new JdoPersistenceSession5(metaModelContext, txAwarePmfProxy.getObject());
         interactionSession.putAttribute(JdoPersistenceSession.class, persistenceSession);
         persistenceSession.open();
     }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/facets/entity/JdoEntityFacet.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/facets/entity/JdoEntityFacet.java
index 9ef26ec..ab07a31 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/facets/entity/JdoEntityFacet.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/facets/entity/JdoEntityFacet.java
@@ -22,6 +22,7 @@ import java.lang.reflect.Method;
 import java.util.List;
 import java.util.function.Supplier;
 
+import javax.inject.Inject;
 import javax.jdo.FetchGroup;
 import javax.jdo.PersistenceManager;
 
@@ -33,27 +34,27 @@ import org.apache.isis.applib.query.NamedQuery;
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.repository.EntityState;
+import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.applib.services.xactn.TransactionalProcessor;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
-import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.metamodel.adapter.oid.ObjectNotFoundException;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
+import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.transaction.changetracking.EntityChangeTracker;
 import org.apache.isis.persistence.jdo.datanucleus.entities.DnEntityStateProvider;
 import org.apache.isis.persistence.jdo.datanucleus.oid.JdoObjectIdSerializer;
 import org.apache.isis.persistence.jdo.integration.metamodel.JdoMetamodelUtil;
-import org.apache.isis.persistence.jdo.integration.persistence.FetchResultHandler;
-import org.apache.isis.persistence.jdo.integration.persistence.JdoPersistenceSession;
+import org.apache.isis.persistence.jdo.spring.integration.TransactionAwarePersistenceManagerFactoryProxy;
 
 import lombok.NonNull;
 import lombok.val;
@@ -63,6 +64,11 @@ import lombok.extern.log4j.Log4j2;
 public class JdoEntityFacet 
 extends FacetAbstract
 implements EntityFacet {
+    
+    @Inject private TransactionAwarePersistenceManagerFactoryProxy pmf;
+    @Inject private TransactionService txService;
+    @Inject private EntityChangeTracker entityChangeTracker;
+    @Inject private ObjectManager objectManager;
 
     public JdoEntityFacet(
             final FacetHolder holder) {
@@ -317,52 +323,55 @@ implements EntityFacet {
     // -- INTERACTION TRACKER LAZY LOOKUP
     
     // memoizes the lookup, just an optimization 
-    private final _Lazy<InteractionTracker> isisInteractionTrackerLazy = _Lazy.threadSafe(
-            ()->getServiceRegistry().lookupServiceElseFail(InteractionTracker.class));
+//    private final _Lazy<InteractionTracker> isisInteractionTrackerLazy = _Lazy.threadSafe(
+//            ()->getServiceRegistry().lookupServiceElseFail(InteractionTracker.class));
     
     // -- DEPENDENCIES
     
     private PersistenceManager getPersistenceManager() {
-        return getJdoPersistenceSession().getPersistenceManager();
+        if(pmf==null) {
+            getFacetHolder().getServiceInjector().injectServicesInto(this);
+        }
+        return pmf.getPersistenceManager();
     }
     
     private TransactionalProcessor getTransactionalProcessor() {
-        return getJdoPersistenceSession().getTransactionalProcessor();
-    }
-    
-    private FetchResultHandler getFetchResultHandler() {
-        return getJdoPersistenceSession().getFetchResultHandler();
+        if(txService==null) {
+            getFacetHolder().getServiceInjector().injectServicesInto(this);
+        }
+        return txService;
     }
     
-    private JdoPersistenceSession getJdoPersistenceSession() {
-        return isisInteractionTrackerLazy.get().currentInteractionSession()
-                .map(interactionSession->interactionSession.getAttribute(JdoPersistenceSession.class))
-                .orElseThrow(()->_Exceptions.illegalState("no JdoPersistenceSession on current thread"));
-    }
+//    private JdoPersistenceSession getJdoPersistenceSession() {
+//        return isisInteractionTrackerLazy.get().currentInteractionSession()
+//                .map(interactionSession->interactionSession.getAttribute(JdoPersistenceSession.class))
+//                .orElseThrow(()->_Exceptions.illegalState("no JdoPersistenceSession on current thread"));
+//    }
     
     // -- HELPER
     
     private Can<ManagedObject> fetchWithinTransaction(Supplier<List<?>> fetcher) {
-        val fetchResultHandler = getFetchResultHandler();
         return getTransactionalProcessor().callWithinCurrentTransactionElseCreateNew(
                 ()->_NullSafe.stream(fetcher.get())
-                    .map(fetchedObject->adopt(fetchResultHandler, fetchedObject))
+                    .map(fetchedObject->adopt(fetchedObject))
                     .collect(Can.toCan()))
                 .orElseFail();
     }
     
-    private ManagedObject adopt(final FetchResultHandler fetchResultHandler, final Object fetchedObject) {
+    private ManagedObject adopt(final Object fetchedObject) {
         // handles lifecycle callbacks and injects services
         
         // ought not to be necessary, however for some queries it seems that the
         // lifecycle listener is not called
         if(fetchedObject instanceof Persistable) {
             // an entity
-            return fetchResultHandler.initializeEntityAfterFetched((Persistable) fetchedObject);
-            
+            val entity = objectManager.adapt(fetchedObject); 
+                    //fetchResultHandler.initializeEntityAfterFetched((Persistable) fetchedObject);
+            entityChangeTracker.recognizeLoaded(entity);
+            return entity;
         } else {
             // a value type
-            return fetchResultHandler.initializeValueAfterFetched(fetchedObject);
+            return objectManager.adapt(fetchedObject);
         }
     }
     
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/FetchResultHandler.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/FetchResultHandler.java
deleted file mode 100644
index 99a8e53..0000000
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/FetchResultHandler.java
+++ /dev/null
@@ -1,30 +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.integration.persistence;
-
-import org.datanucleus.enhancement.Persistable;
-
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-public interface FetchResultHandler {
-    
-    ManagedObject initializeEntityAfterFetched(Persistable pojo);
-    ManagedObject initializeValueAfterFetched(Object pojo);
-
-}
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/HasFetchResultHandler.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/HasFetchResultHandler.java
deleted file mode 100644
index 003b0c8..0000000
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/HasFetchResultHandler.java
+++ /dev/null
@@ -1,25 +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.integration.persistence;
-
-public interface HasFetchResultHandler {
-
-    FetchResultHandler getFetchResultHandler();
-    
-}
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/HasTransactionalProcessor.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/HasTransactionalProcessor.java
deleted file mode 100644
index 6e614a7..0000000
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/HasTransactionalProcessor.java
+++ /dev/null
@@ -1,27 +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.integration.persistence;
-
-import org.apache.isis.applib.services.xactn.TransactionalProcessor;
-
-public interface HasTransactionalProcessor {
-
-    TransactionalProcessor getTransactionalProcessor();
-    
-}
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoFetchResultHandler.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoFetchResultHandler.java
index a7f9a00..10fdad3 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoFetchResultHandler.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoFetchResultHandler.java
@@ -30,13 +30,12 @@ import org.apache.isis.core.transaction.changetracking.EntityChangeTracker;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
-public class JdoFetchResultHandler implements FetchResultHandler {
+public class JdoFetchResultHandler {
 
     private final MetaModelContext metaModelContext;
     private final PersistenceManager persistenceManager;
     private final EntityChangeTracker entityChangeTracker;
     
-    @Override
     public ManagedObject initializeEntityAfterFetched(final Persistable pojo) {
 
         final ManagedObject entity = _Utils
@@ -47,7 +46,6 @@ public class JdoFetchResultHandler implements FetchResultHandler {
         return entity;
     }
     
-    @Override
     public ManagedObject initializeValueAfterFetched(final @Nullable Object pojo) {
         return _Utils.adaptNullableAndInjectServices(metaModelContext, pojo);
     }
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession.java
index dc321b9..d5cd541 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession.java
@@ -25,9 +25,7 @@ import org.apache.isis.persistence.jdo.provider.persistence.HasPersistenceManage
 public interface JdoPersistenceSession 
 extends 
     HasMetaModelContext,
-    HasPersistenceManager,
-    HasTransactionalProcessor,
-    HasFetchResultHandler {
+    HasPersistenceManager {
 
     /**
      * Binds this {@link JdoPersistenceSession} to the current {@link InteractionSession}.
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession5.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession5.java
index 7b1f2ae..544417f 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession5.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSession5.java
@@ -22,7 +22,6 @@ import javax.enterprise.inject.Vetoed;
 import javax.jdo.PersistenceManager;
 import javax.jdo.PersistenceManagerFactory;
 
-import org.apache.isis.applib.services.xactn.TransactionalProcessor;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.transaction.changetracking.EntityChangeTracker;
 import org.apache.isis.persistence.jdo.integration.lifecycles.IsisLifecycleListener;
@@ -44,9 +43,7 @@ implements
     // -- FIELDS
 
     @Getter(onMethod_ = {@Override}) private PersistenceManager persistenceManager;
-    @Getter(onMethod_ = {@Override}) private final TransactionalProcessor transactionalProcessor;
     @Getter(onMethod_ = {@Override}) private final MetaModelContext metaModelContext;
-    @Getter(onMethod_ = {@Override}) private FetchResultHandler fetchResultHandler;
 
     private final PersistenceManagerFactory pmf;
     private Runnable unregisterLifecycleListeners;
@@ -68,9 +65,6 @@ implements
 
         this.metaModelContext = metaModelContext;
         this.pmf = pmf;
-
-        // sub-components
-        this.transactionalProcessor = metaModelContext.getTransactionService();
                 
         this.state = State.NOT_INITIALIZED;
     }
@@ -116,9 +110,6 @@ implements
         val entityChangeEmitter = 
                 new JdoEntityChangeEmitter(getMetaModelContext(), persistenceManager, entityChangeTracker);
         
-        fetchResultHandler = 
-                new JdoFetchResultHandler(getMetaModelContext(), persistenceManager, entityChangeTracker);
-        
         val isisLifecycleListener = new IsisLifecycleListener(entityChangeEmitter);
         persistenceManager.addInstanceLifecycleListener(isisLifecycleListener, (Class[]) null);
 
@@ -166,7 +157,8 @@ implements
 //                PersistenceManagerFactoryUtils.releasePersistenceManager(pmHolder.getPersistenceManager(), pmf);
 //            }
             
-            persistenceManager.close();
+            persistenceManager = null; // detach
+            
         } catch(final Throwable ex) {
             // ignore
             log.error(
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSessionFactory.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSessionFactory.java
deleted file mode 100644
index 8284e15..0000000
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSessionFactory.java
+++ /dev/null
@@ -1,25 +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.integration.persistence;
-
-public interface JdoPersistenceSessionFactory {
-
-    JdoPersistenceSession createPersistenceSession();
-
-}
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSessionFactory5.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSessionFactory5.java
deleted file mode 100644
index 20acebe..0000000
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/persistence/JdoPersistenceSessionFactory5.java
+++ /dev/null
@@ -1,65 +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.integration.persistence;
-
-import java.util.Objects;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Service;
-
-import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.persistence.jdo.spring.integration.LocalPersistenceManagerFactoryBean;
-
-/**
- *
- * Factory for {@link JdoPersistenceSession}.
- *
- */
-@Service
-@Named("isisJdoDn5.PersistenceSessionFactory5")
-@Order(OrderPrecedence.MIDPOINT)
-@Primary
-@Qualifier("JdoDN5")
-@Singleton
-public class JdoPersistenceSessionFactory5
-implements JdoPersistenceSessionFactory {
-    
-    @Inject private LocalPersistenceManagerFactoryBean localPmfBean;
-    @Inject private MetaModelContext metaModelContext;
-    
-    @Override
-    public JdoPersistenceSession5 createPersistenceSession() {
-
-        Objects.requireNonNull(localPmfBean,
-                () -> "PersistenceSessionFactory5 requires initialization. " + this.hashCode());
-
-        return new JdoPersistenceSession5(
-                metaModelContext, 
-                localPmfBean.getObject());
-    }
-    
-
-}
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactionService.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactionService.java
index cc60e39..ce7860b 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactionService.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactionService.java
@@ -18,6 +18,9 @@
  */
 package org.apache.isis.testdomain.transactions.jdo.isis;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -25,9 +28,6 @@ import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -36,7 +36,6 @@ import org.apache.isis.testdomain.conf.Configuration_usingJdoIsis;
 import org.apache.isis.testdomain.jdo.JdoTestDomainPersona;
 import org.apache.isis.testdomain.jdo.entities.JdoBook;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
-import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract;
 
 import lombok.val;
 
@@ -45,7 +44,9 @@ import lombok.val;
                 Configuration_usingJdoIsis.class,
         })
 @TestPropertySource(IsisPresets.UseLog4j2Test)
-class JdoIsisTransactionRollbackTest_usingTransactionService extends IsisIntegrationTestAbstract {
+class JdoIsisTransactionRollbackTest_usingTransactionService 
+//extends IsisIntegrationTestAbstract 
+{
 
     @Inject private FixtureScripts fixtureScripts;
     @Inject private TransactionService transactionService;
@@ -53,46 +54,48 @@ class JdoIsisTransactionRollbackTest_usingTransactionService extends IsisIntegra
 
     @BeforeEach
     void setUp() {
-        // cleanup
-        fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll);
+        
+        transactionService.runWithinCurrentTransactionElseCreateNew(()->{
+            // cleanup
+            fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll);
+            
+        });
     }
 
     @Test
     void happyCaseTx_shouldCommit() {
 
-        // expected pre condition
-        assertEquals(0, repository.allInstances(JdoBook.class).size());
-
-
         transactionService.runWithinCurrentTransactionElseCreateNew(()->{
+            // expected pre condition
+            assertEquals(0, repository.allInstances(JdoBook.class).size());
 
             fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book);
-
+        
+            // expected post condition
+            assertEquals(1, repository.allInstances(JdoBook.class).size());
         });
 
-        // expected post condition
-        assertEquals(1, repository.allInstances(JdoBook.class).size());
-
     }
 
     @Test
     void whenExceptionWithinTx_shouldRollback() {
 
-        // expected pre condition
-        assertEquals(0, repository.allInstances(JdoBook.class).size());
+        transactionService.runWithinCurrentTransactionElseCreateNew(()->{
+            // expected pre condition
+            assertEquals(0, repository.allInstances(JdoBook.class).size());
+        });
 
         val result = transactionService.runWithinCurrentTransactionElseCreateNew(()->{
-
             fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book);
-
             throw _Exceptions.unrecoverable("Test: force current tx to rollback");            
-
         });    
         
         assertTrue(result.isFailure());
 
-        // expected post condition
-        assertEquals(0, repository.allInstances(JdoBook.class).size());
+        transactionService.runWithinCurrentTransactionElseCreateNew(()->{
+            // expected post condition
+            assertEquals(0, repository.allInstances(JdoBook.class).size());
+        });
 
     }
 
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactional.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactional.java
index e055b92..36740e3 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactional.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactional.java
@@ -89,7 +89,7 @@ class JdoIsisTransactionRollbackTest_usingTransactional
             _Probe.errOut("after fixture");
             
             // expected post condition
-            //assertEquals(1, repository.allInstances(JdoBook.class).size());
+            assertEquals(1, repository.allInstances(JdoBook.class).size());
             
             
         });
@@ -103,8 +103,8 @@ class JdoIsisTransactionRollbackTest_usingTransactional
 
         interactionFactory.runAnonymous(()->{
 
-        // expected condition
-        assertEquals(0, repository.allInstances(JdoBook.class).size());
+            // expected condition
+            assertEquals(0, repository.allInstances(JdoBook.class).size());
         
         });
 
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionScopeListenerTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionScopeListenerTest.java
index f4568aa..bfbc40b 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionScopeListenerTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionScopeListenerTest.java
@@ -24,6 +24,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
+import org.springframework.transaction.annotation.Transactional;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -43,6 +44,7 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
                 Configuration_usingJdoIsis.class,
                 InteractionBoundaryProbe.class
         })
+@Transactional
 @TestPropertySource(IsisPresets.UseLog4j2Test)
 /**
  * With this test we manage IsisInteractions ourselves. (not sub-classing IsisIntegrationTestAbstract)
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactional.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/spring/JdoSpringTransactionRollbackTest_usingTransactionalAndFixtures.java
similarity index 64%
copy from regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactional.java
copy to regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/spring/JdoSpringTransactionRollbackTest_usingTransactionalAndFixtures.java
index e055b92..8a2238a 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/isis/JdoIsisTransactionRollbackTest_usingTransactional.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/spring/JdoSpringTransactionRollbackTest_usingTransactionalAndFixtures.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testdomain.transactions.jdo.isis;
+package org.apache.isis.testdomain.transactions.jdo.spring;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -28,12 +28,12 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestMethodOrder;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.annotation.Commit;
+import org.springframework.test.context.TestPropertySource;
 import org.springframework.transaction.annotation.Transactional;
 
 import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.commons.internal.debug._Probe;
-import org.apache.isis.core.interaction.session.InteractionFactory;
-import org.apache.isis.testdomain.conf.Configuration_usingJdoIsis;
+import org.apache.isis.core.config.presets.IsisPresets;
+import org.apache.isis.testdomain.conf.Configuration_usingJdoSpring;
 import org.apache.isis.testdomain.jdo.JdoTestDomainPersona;
 import org.apache.isis.testdomain.jdo.entities.JdoBook;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
@@ -45,69 +45,45 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
  */
 @SpringBootTest(
         classes = { 
-                Configuration_usingJdoIsis.class
+                Configuration_usingJdoSpring.class,
         },
         properties = {
                 "logging.level.org.apache.isis.persistence.jdo.*=DEBUG",
-                "logging.level.org.springframework.test.context.transaction.*=DEBUG",
-                "logging.level.org.datanucleus.*=DEBUG",
-                "logging.config=log4j2-debug-persistence.xml"
-                
+                "logging.level.org.springframework.test.context.transaction.*=DEBUG"
         })
 @Transactional
-//@TestPropertySource(IsisPresets.UseLog4j2Test)
+@TestPropertySource(IsisPresets.UseLog4j2Test)
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
-class JdoIsisTransactionRollbackTest_usingTransactional 
-// extends IsisIntegrationTestAbstract 
+class JdoSpringTransactionRollbackTest_usingTransactionalAndFixtures
 {
-    
-    @Inject private FixtureScripts fixtureScripts;
+
     @Inject private RepositoryService repository;
-    @Inject private InteractionFactory interactionFactory;
-    
+    @Inject private FixtureScripts fixtureScripts;
+
     @Test @Order(1) @Commit
     void cleanup_justInCase() {
-   
         // cleanup just in case
         fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll);
     }
-    
+
     @Test @Order(2)
     void happyCaseTx_shouldCommit() {
-   
-        _Probe.errOut("before interaction");
-        
-        interactionFactory.runAnonymous(()->{
-            
-            // expected pre condition
-            assertEquals(0, repository.allInstances(JdoBook.class).size());
-                
-            _Probe.errOut("before fixture");
-            
-            fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book);
-            
-            _Probe.errOut("after fixture");
-            
-            // expected post condition
-            //assertEquals(1, repository.allInstances(JdoBook.class).size());
-            
-            
-        });
+
+        // expected pre condition
+        assertEquals(0, repository.allInstances(JdoBook.class).size());
         
-        _Probe.errOut("after interaction");
+        fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book);
         
+        // expected post condition
+        assertEquals(1, repository.allInstances(JdoBook.class).size());
+
     }
-    
+
     @Test @Order(3)
     void previousTest_shouldHaveBeenRolledBack() {
 
-        interactionFactory.runAnonymous(()->{
-
         // expected condition
         assertEquals(0, repository.allInstances(JdoBook.class).size());
-        
-        });
-
     }
 
 }
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/spring/JdoSpringTransactionScopeListenerTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/spring/JdoSpringTransactionScopeListenerTest.java
index 8a0dc9a..a5cc41e 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/spring/JdoSpringTransactionScopeListenerTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/jdo/spring/JdoSpringTransactionScopeListenerTest.java
@@ -18,16 +18,15 @@
  */
 package org.apache.isis.testdomain.transactions.jdo.spring;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.config.presets.IsisPresets;
@@ -78,7 +77,7 @@ class JdoSpringTransactionScopeListenerTest {
         
     }
     
-    @Test @Disabled("wip")
+    @Test
     void sessionScopedProbe_shouldBeReused_andBeAwareofTransactionBoundaries() {
         
         // new IsisInteractionScope