You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2022/05/19 15:45:57 UTC

[isis] branch ISIS-2651 created (now 8d5b4cbd68)

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

danhaywood pushed a change to branch ISIS-2651
in repository https://gitbox.apache.org/repos/asf/isis.git


      at 8d5b4cbd68 ISIS-2651: adds config properties for eagerly create tables in DN; reinstates JdoEntityDiscoveryListener hook

This branch includes the following new commits:

     new 8d5b4cbd68 ISIS-2651: adds config properties for eagerly create tables in DN; reinstates JdoEntityDiscoveryListener hook

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[isis] 01/01: ISIS-2651: adds config properties for eagerly create tables in DN; reinstates JdoEntityDiscoveryListener hook

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2651
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 8d5b4cbd6834866a564404730e1c101c645d1f1c
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Thu May 19 16:45:47 2022 +0100

    ISIS-2651: adds config properties for eagerly create tables in DN; reinstates JdoEntityDiscoveryListener hook
---
 .../isis/core/config/DatanucleusConfiguration.java | 382 +++++++++++++++++++--
 .../additional-spring-configuration-metadata.json  |  17 +
 .../IsisModulePersistenceJdoDatanucleus.java       |  27 +-
 .../config/DnEntityDiscoveryListener.java          |  78 -----
 .../config/JdoEntityDiscoveryListener.java         |  18 +-
 5 files changed, 413 insertions(+), 109 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/DatanucleusConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/DatanucleusConfiguration.java
index 7d27f7093a..3d830726c7 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/DatanucleusConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/DatanucleusConfiguration.java
@@ -35,7 +35,7 @@ import lombok.Data;
  *     entries in <tt>additional-spring-configuration-metadata.json</tt>.
  * </p>
  *
- * @see <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+ * @see <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
  */
 @ConfigurationProperties("datanucleus")
 @Data
@@ -55,7 +55,7 @@ public class DatanucleusConfiguration {
      *
      * <p>
      *     For more details, see
-     *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>.
+     *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>.
      * </p>
      */
     private boolean persistenceByReachabilityAtCommit = true;
@@ -71,7 +71,7 @@ public class DatanucleusConfiguration {
      *
      * <p>
      *     For more details, see
-     *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>.
+     *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>.
      * </p>
      */
     private boolean manageRelationships = true;
@@ -86,7 +86,7 @@ public class DatanucleusConfiguration {
             MixedCase
         }
 
-        // declared only in additional-spring-configuratoin-metadata.json to rename to 'case'
+        // declared only in additional-spring-configuration-metadata.json to rename to 'case'
         // private Case identifierCase = Case.UPPERCASE;
     }
 
@@ -106,9 +106,9 @@ public class DatanucleusConfiguration {
              *
              * <p>
              *     For more details, see
-             *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+             *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
              *     and the
-             *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#cache_level2">DataNucleus Cache docs</a>.
+             *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#cache_level2">DataNucleus Cache docs</a>.
              * </p>
              */
             @NotNull @NotEmpty
@@ -132,9 +132,9 @@ public class DatanucleusConfiguration {
              *
              * <p>
              *     For more details, see
-             *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+             *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
              *     and the
-             *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#cache_level2">DataNucleus Cache docs</a>.
+             *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#cache_level2">DataNucleus Cache docs</a>.
              * </p>
              */
             private CacheMode mode = CacheMode.UNSPECIFIED;
@@ -146,15 +146,25 @@ public class DatanucleusConfiguration {
     public static class Schema {
 
         /**
-         * Whether to automatically generate any schema, tables, columns,
+         * Whether to automatically (but lazily) generate any schema, tables, columns,
          * constraints that don’t exist.
          *
          * <p>
+         *     For integration testing, it's generally better to use {@link Generatedatabase#setMode(String) datanucleus.schema.generateDatabase.mode},
+         *     which will eagerly create all tables on startup.
+         * </p>
+         *
+         * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
+         *
+         * @see #setAutoCreateColumns(boolean)
+         * @see #setAutoCreateConstraints(boolean)
+         * @see #setAutoCreateTables(boolean)
+         * @see Generatedatabase#setMode(String)
          */
         private boolean autoCreateAll = false;
 
@@ -165,9 +175,9 @@ public class DatanucleusConfiguration {
          *
          * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
          */
         private boolean autoCreateDatabase = false;
@@ -177,10 +187,15 @@ public class DatanucleusConfiguration {
          *
          * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
+         *
+         * @see #setAutoCreateAll(boolean)
+         * @see #setAutoCreateColumns(boolean)
+         * @see #setAutoCreateConstraints(boolean)
+         * @see Generatedatabase#setMode(String)
          */
         private boolean autoCreateTables = false;
 
@@ -189,10 +204,15 @@ public class DatanucleusConfiguration {
          *
          * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
+         *
+         * @see #setAutoCreateAll(boolean)
+         * @see #setAutoCreateConstraints(boolean)
+         * @see #setAutoCreateTables(boolean)
+         * @see Generatedatabase#setMode(String)
          */
         private boolean autoCreateColumns = false;
 
@@ -201,10 +221,15 @@ public class DatanucleusConfiguration {
          *
          * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
+         *
+         * @see #setAutoCreateAll(boolean)
+         * @see #setAutoCreateColumns(boolean)
+         * @see #setAutoCreateTables(boolean)
+         * @see Generatedatabase#setMode(String)
          */
         private boolean autoCreateConstraints = false;
 
@@ -213,9 +238,9 @@ public class DatanucleusConfiguration {
          *
          * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
          */
         private boolean validateTables = false;
@@ -227,9 +252,9 @@ public class DatanucleusConfiguration {
          *
          * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
          */
         private boolean validateColumns = false;
@@ -239,9 +264,9 @@ public class DatanucleusConfiguration {
          *
          * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
          */
         private boolean validateConstraints = false;
@@ -253,11 +278,314 @@ public class DatanucleusConfiguration {
          *
          * <p>
          *     For more details, see
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
          *     and the
-         *     <a href="https://www.datanucleus.org/products/accessplatform_5_2/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+         *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
          * </p>
          */
         private boolean validateAll = false;
+
+        private final Generatedatabase generatedatabase = new Generatedatabase();
+        @Data
+        public static class Generatedatabase {
+
+            /**
+             * Whether to eagerly create all tables at startup.
+             *
+             * <p>
+             *     For integration testing, this is generally preferred to using {@link DatanucleusConfiguration.Schema#setAutoCreateAll(boolean) datanucleus.schema.autoCreateAll},
+             *     because the <code>autoCreateAll</code> will only create tables lazily, when first persisted to.  While lazily initialization is potentially quicker,
+             *     it can cause issues (eg with rollup mapping to super class tables).
+             * </p>
+             *
+             * <p>
+             *     Valid values: <code><b>none</b></code>, <code>create</code>, <code>drop-and-create</code>, <code>drop</code>.
+             * </p>
+             *
+             * <p>
+             *     For more details, see
+             *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#pmf_properties">DataNucleus Config Property docs</a>
+             *     and the
+             *     <a href="https://www.datanucleus.org/products/accessplatform_6_0/jdo/persistence.html#schema">DataNucleus Schema Guide</a>.
+             * </p>
+             */
+            private String mode = "none";
+        }
     }
 }
+
+/*
+As of 6.0.0-M5, these are all the config properties supported.
+I'm pasting them here so that we might choose to surface some via application.properties, ie, define in this class.
+
+Note: As it's not easy (impossible?) to define camelCase in Spring Boot, but because DN does case-insensitive checks, we can just make em lowercase.
+
+datanucleus.allowattachoftransient
+datanucleus.allowcallbacks
+datanucleus.allowinstancecallbackannotations
+datanucleus.allowlistenerupdateafterinit
+datanucleus.attachsamedatastore
+datanucleus.autostartclassnames
+datanucleus.autostartmechanism
+datanucleus.autostartmechanismmode
+datanucleus.autostartmechanismxmlfile
+datanucleus.autostartmetadatafiles
+datanucleus.cache.collections
+datanucleus.cache.collections.lazy
+datanucleus.cache.level1.type
+datanucleus.cache.level2.batchsize
+datanucleus.cache.level2.cacheembedded
+datanucleus.cache.level2.cachename
+datanucleus.cache.level2.clearatclose
+datanucleus.cache.level2.expirymillis
+datanucleus.cache.level2.loadfields
+datanucleus.cache.level2.maxsize
+datanucleus.cache.level2.mode
+datanucleus.cache.level2.readthrough
+datanucleus.cache.level2.retrievemode
+datanucleus.cache.level2.statisticsenabled
+datanucleus.cache.level2.storebyvalue
+datanucleus.cache.level2.storemode
+datanucleus.cache.level2.type
+datanucleus.cache.level2.updatemode
+datanucleus.cache.level2.writethrough
+datanucleus.cache.querycompilation.type
+datanucleus.cache.querycompilationdatastore.type
+datanucleus.cache.queryresults.cachename
+datanucleus.cache.queryresults.clearatclose
+datanucleus.cache.queryresults.expirymillis
+datanucleus.cache.queryresults.maxsize
+datanucleus.cache.queryresults.type
+datanucleus.classloaderresolvername
+datanucleus.connection.nontx.releaseafteruse
+datanucleus.connection.resourcetype
+datanucleus.connection.singleconnectionperexecutioncontext
+datanucleus.connection2.resourcetype
+datanucleus.connectiondrivername
+datanucleus.connectionfactory
+datanucleus.connectionfactory2
+datanucleus.connectionfactory2name
+datanucleus.connectionfactoryname
+datanucleus.connectionpassword
+datanucleus.connectionpassworddecrypter
+datanucleus.connectionpool.driverprops
+datanucleus.connectionpool.initialpoolsize
+datanucleus.connectionpool.maxactive
+datanucleus.connectionpool.maxconnections
+datanucleus.connectionpool.maxidle
+datanucleus.connectionpool.maxpoolsize
+datanucleus.connectionpool.maxstatements
+datanucleus.connectionpool.maxwait
+datanucleus.connectionpool.minevictableidletimemillis
+datanucleus.connectionpool.minidle
+datanucleus.connectionpool.minpoolsize
+datanucleus.connectionpool.testsql
+datanucleus.connectionpool.timebetweenevictionrunsmillis
+datanucleus.connectionpoolingtype
+datanucleus.connectionpoolingtype.nontx
+datanucleus.connectionurl
+datanucleus.connectionusername
+datanucleus.copyonattach
+datanucleus.currentuser
+datanucleus.currentuserprovider
+datanucleus.datastoreidentitytype
+datanucleus.datastorereadtimeout
+datanucleus.datastorewritetimeout
+datanucleus.deletionpolicy
+datanucleus.detachalloncommit
+datanucleus.detachallonrollback
+datanucleus.detachaswrapped
+datanucleus.detachedstate
+datanucleus.detachmentfields
+datanucleus.detachonclose
+datanucleus.enablestatistics
+datanucleus.executioncontext.closeactivetxaction
+datanucleus.executioncontext.maxidle
+datanucleus.executioncontext.reaperthread
+datanucleus.findobject.typeconversion
+datanucleus.findobject.validatewhencached
+datanucleus.flush.auto.objectlimit
+datanucleus.flush.mode
+datanucleus.identifier.case
+datanucleus.identifier.namingfactory
+datanucleus.identifier.tableprefix
+datanucleus.identifier.tablesuffix
+datanucleus.identifier.wordseparator
+datanucleus.identifierfactory
+datanucleus.identitykeytranslatortype
+datanucleus.identitystringtranslatortype
+datanucleus.ignorecache
+datanucleus.jmxtype
+datanucleus.managerelationships
+datanucleus.managerelationshipschecks
+datanucleus.mapping
+datanucleus.mapping.catalog
+datanucleus.mapping.schema
+datanucleus.maxfetchdepth
+datanucleus.metadata.allowannotations
+datanucleus.metadata.allowloadatruntime
+datanucleus.metadata.allowxml
+datanucleus.metadata.alwaysdetachable
+datanucleus.metadata.autoregistration
+datanucleus.metadata.defaultinheritancestrategy
+datanucleus.metadata.defaultnullable
+datanucleus.metadata.embedded.flat
+datanucleus.metadata.ignoremetadataformissingclasses
+datanucleus.metadata.javaxvalidationshortcuts
+datanucleus.metadata.jdofileextension
+datanucleus.metadata.jdoqueryfileextension
+datanucleus.metadata.ormfileextension
+datanucleus.metadata.supportorm
+datanucleus.metadata.usediscriminatorclassnamebydefault
+datanucleus.metadata.usediscriminatorforsingletable
+datanucleus.metadata.xml.allowjdo1_0
+datanucleus.metadata.xml.namespaceaware
+datanucleus.metadata.xml.validate
+datanucleus.multithreaded
+datanucleus.name
+datanucleus.optimistic
+datanucleus.persistencebyreachabilityatcommit
+datanucleus.persistenceunitloadclasses
+datanucleus.persistenceunitname
+datanucleus.persistencexmlfilename
+datanucleus.plugin.allowuserbundles
+datanucleus.plugin.pluginregistrybundlecheck
+datanucleus.plugin.pluginregistryclassname
+datanucleus.plugin.validateplugins
+datanucleus.primaryclassloader
+datanucleus.propertiesfile
+datanucleus.query.checkunusedparameters
+datanucleus.query.closeable
+datanucleus.query.compilation.cached
+datanucleus.query.compilenamedqueriesatstartup
+datanucleus.query.compileoptimisevarthis
+datanucleus.query.evaluateinmemory
+datanucleus.query.flushbeforeexecution
+datanucleus.query.jdoql.allowall
+datanucleus.query.jpql.allowrange
+datanucleus.query.loadresultsatcommit
+datanucleus.query.resultcache.validateobjects
+datanucleus.query.results.cached
+datanucleus.query.resultsizemethod
+datanucleus.query.sql.allowall
+datanucleus.query.sql.syntaxchecks
+datanucleus.query.usefetchplan
+datanucleus.rdbms.allowcolumnreuse
+datanucleus.rdbms.autofetchunloadedbasicfields
+datanucleus.rdbms.autofetchunloadedfks
+datanucleus.rdbms.checkexisttablesorviews
+datanucleus.rdbms.classadditionmaxretries
+datanucleus.rdbms.clonecalendarfordatetimezone
+datanucleus.rdbms.constraintcreatemode
+datanucleus.rdbms.datastoreadapterclassname
+datanucleus.rdbms.discriminatorpersubclasstable
+datanucleus.rdbms.dynamicschemaupdates
+datanucleus.rdbms.informix.useserialforidentity
+datanucleus.rdbms.initializecolumninfo
+datanucleus.rdbms.mysql.characterset
+datanucleus.rdbms.mysql.collation
+datanucleus.rdbms.mysql.enginetype
+datanucleus.rdbms.omitdatabasemetadatagetcolumns
+datanucleus.rdbms.omitvaluegenerationgetcolumns
+datanucleus.rdbms.oracle.nlssortorder
+datanucleus.rdbms.persistemptystringasnull
+datanucleus.rdbms.query.fetchdirection
+datanucleus.rdbms.query.multivaluedfetch
+datanucleus.rdbms.query.resultsetconcurrency
+datanucleus.rdbms.query.resultsettype
+datanucleus.rdbms.refreshalltablesonrefreshcolumns
+datanucleus.rdbms.schematable.tablename
+datanucleus.rdbms.sqltablenamingstrategy
+datanucleus.rdbms.statementbatchlimit
+datanucleus.rdbms.statementlogging
+datanucleus.rdbms.stringdefaultlength
+datanucleus.rdbms.stringlengthexceededaction
+datanucleus.rdbms.tablecolumnorder
+datanucleus.rdbms.uniqueconstraints.mapinverse
+datanucleus.rdbms.usecolumndefaultwhennull
+datanucleus.rdbms.usedefaultsqltype
+datanucleus.rdbms.uselegacynativevaluestrategy
+datanucleus.readonlydatastore
+datanucleus.readonlydatastoreaction
+datanucleus.relation.identitystoragemode
+datanucleus.restorevalues
+datanucleus.retainvalues
+datanucleus.schema.autocreateall
+datanucleus.schema.autocreatecolumns
+datanucleus.schema.autocreateconstraints
+datanucleus.schema.autocreatedatabase
+datanucleus.schema.autocreatetables
+datanucleus.schema.autocreatewarnonerror
+datanucleus.schema.generatedatabase.create.order
+datanucleus.schema.generatedatabase.createscript
+datanucleus.schema.generatedatabase.drop.order
+datanucleus.schema.generatedatabase.dropscript
+datanucleus.schema.generatedatabase.mode
+datanucleus.schema.generatescripts.create
+datanucleus.schema.generatescripts.drop
+datanucleus.schema.generatescripts.mode
+datanucleus.schema.loadscript
+datanucleus.schema.validateall
+datanucleus.schema.validatecolumns
+datanucleus.schema.validateconstraints
+datanucleus.schema.validatetables
+datanucleus.serializeread
+datanucleus.servertimezoneid
+datanucleus.singletonpmfforname
+datanucleus.statemanager.classname
+datanucleus.store.allowreferenceswithnoimplementations
+datanucleus.tenantid
+datanucleus.tenantprovider
+datanucleus.tenantreadids
+datanucleus.transaction.isolation
+datanucleus.transaction.jta.transactionmanagerjndi
+datanucleus.transaction.jta.transactionmanagerlocator
+datanucleus.transaction.nontx.atomic
+datanucleus.transaction.nontx.read
+datanucleus.transaction.nontx.write
+datanucleus.transaction.type
+datanucleus.type.treatjavautildateasmutable
+datanucleus.type.wrapper.basis
+datanucleus.useimplementationcreator
+datanucleus.validation.factory
+datanucleus.validation.group.pre-persist
+datanucleus.validation.group.pre-remove
+datanucleus.validation.group.pre-update
+datanucleus.validation.mode
+datanucleus.valuegeneration.increment.allocationsize
+datanucleus.valuegeneration.sequence.allocationsize
+datanucleus.valuegeneration.transactionattribute
+datanucleus.valuegeneration.transactionisolation
+datanucleus.version.versionnumber.initialvalue
+javax.jdo.mapping.catalog
+javax.jdo.mapping.schema
+javax.jdo.option.connectiondrivername
+javax.jdo.option.connectionfactory
+javax.jdo.option.connectionfactory2
+javax.jdo.option.connectionfactory2name
+javax.jdo.option.connectionfactoryname
+javax.jdo.option.connectionpassword
+javax.jdo.option.connectionurl
+javax.jdo.option.connectionusername
+javax.jdo.option.copyonattach
+javax.jdo.option.datastorereadtimeoutmillis
+javax.jdo.option.datastorewritetimeoutmillis
+javax.jdo.option.detachalloncommit
+javax.jdo.option.ignorecache
+javax.jdo.option.mapping
+javax.jdo.option.multitenancy
+javax.jdo.option.multithreaded
+javax.jdo.option.name
+javax.jdo.option.nontransactionalread
+javax.jdo.option.nontransactionalwrite
+javax.jdo.option.optimistic
+javax.jdo.option.persistenceunitname
+javax.jdo.option.readonly
+javax.jdo.option.restorevalues
+javax.jdo.option.retainvalues
+javax.jdo.option.servertimezoneid
+javax.jdo.option.spi.resourcename
+javax.jdo.option.transactionisolationlevel
+javax.jdo.option.transactiontype
+javax.jdo.persistencemanagerfactoryclass
+ */
diff --git a/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 0de4815bb4..5ed9b0b131 100644
--- a/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -166,6 +166,23 @@
           "value": "None"
         }
       ]
+    },
+    {
+      "name": "datanucleus.schema.generatedatabase.mode",
+      "values": [
+        {
+          "value": "none"
+        },
+        {
+          "value": "create"
+        },
+        {
+          "value": "drop-and-create"
+        },
+        {
+          "value": "drop"
+        }
+      ]
     }
   ]
 }
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 06a200a1c1..6eb284ef24 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
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.persistence.jdo.datanucleus;
 
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Named;
 import javax.inject.Provider;
 import javax.jdo.JDOException;
 import javax.jdo.PersistenceManagerFactory;
@@ -36,13 +40,14 @@ import org.springframework.transaction.interceptor.TransactionInterceptor;
 
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.commons.internal.assertions._Assert;
+import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.beans.IsisBeanTypeRegistry;
 import org.apache.isis.core.config.beans.aoppatch.TransactionInterceptorFactory;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.transaction.changetracking.EntityChangeTracker;
 import org.apache.isis.persistence.jdo.datanucleus.changetracking.JdoLifecycleListener;
-import org.apache.isis.persistence.jdo.datanucleus.config.DnEntityDiscoveryListener;
 import org.apache.isis.persistence.jdo.datanucleus.config.DnSettings;
 import org.apache.isis.persistence.jdo.datanucleus.dialect.DnJdoDialect;
 import org.apache.isis.persistence.jdo.datanucleus.entities.DnEntityStateProvider;
@@ -51,6 +56,7 @@ import org.apache.isis.persistence.jdo.datanucleus.mixins.Persistable_datanucleu
 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.integration.IsisModulePersistenceJdoIntegration;
+import org.apache.isis.persistence.jdo.provider.config.JdoEntityDiscoveryListener;
 import org.apache.isis.persistence.jdo.spring.integration.JdoDialect;
 import org.apache.isis.persistence.jdo.spring.integration.JdoTransactionManager;
 import org.apache.isis.persistence.jdo.spring.integration.LocalPersistenceManagerFactoryBean;
@@ -69,7 +75,6 @@ import lombok.extern.log4j.Log4j2;
     IsisModulePersistenceJdoIntegration.class,
 
     // @Component's
-    DnEntityDiscoveryListener.class,
     DnEntityStateProvider.class,
 
     // @Mixin's
@@ -136,16 +141,32 @@ public class IsisModulePersistenceJdoDatanucleus {
     @Bean @Primary
     public TransactionAwarePersistenceManagerFactoryProxy getTransactionAwarePersistenceManagerFactoryProxy(
             final MetaModelContext metaModelContext,
-            final @Qualifier("local-pmf-proxy") LocalPersistenceManagerFactoryBean localPmfBean) {
+            final @Qualifier("local-pmf-proxy") LocalPersistenceManagerFactoryBean localPmfBean,
+            final IsisBeanTypeRegistry beanTypeRegistry,
+            final List<JdoEntityDiscoveryListener> jdoEntityDiscoveryListeners,
+            final DnSettings dnSettings) {
 
         val pmf = localPmfBean.getObject(); // created once per application lifecycle
 
+        final Map<String, String> props = _Maps.newLinkedHashMap();
+        dnSettings.getDatanucleus().forEach((key, value) -> props.put("datanucleus." + key, value));
+        dnSettings.getJavax().entrySet().stream()
+                .filter(x -> x.getKey().startsWith("jdo."))
+                .forEach( x -> props.put("javax." + x.getKey(), x.getValue())
+        );
+
+        _NullSafe.stream(jdoEntityDiscoveryListeners)
+                .forEach(listener->{
+                    listener.onEntitiesDiscovered(pmf, beanTypeRegistry.getEntityTypes(), props);
+                });
+
         val tapmfProxy = new TransactionAwarePersistenceManagerFactoryProxy(metaModelContext);
         tapmfProxy.setTargetPersistenceManagerFactory(pmf);
         tapmfProxy.setAllowCreate(false);
         return tapmfProxy;
     }
 
+
     @Qualifier("jdo-platform-transaction-manager")
     @Bean @Primary
     public JdoTransactionManager getTransactionManager(
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/config/DnEntityDiscoveryListener.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/config/DnEntityDiscoveryListener.java
deleted file mode 100644
index 1476cb2992..0000000000
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/config/DnEntityDiscoveryListener.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jdo.datanucleus.config;
-
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import javax.jdo.PersistenceManagerFactory;
-
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.datanucleus.store.schema.SchemaAwareStoreManager;
-import org.springframework.stereotype.Component;
-
-import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.persistence.jdo.provider.config.JdoEntityDiscoveryListener;
-
-import lombok.NonNull;
-import lombok.val;
-
-@Component
-public class DnEntityDiscoveryListener implements JdoEntityDiscoveryListener {
-
-    @Override
-    public void onEntitiesDiscovered(
-            final @NonNull PersistenceManagerFactory persistenceManagerFactory,
-            final @NonNull Set<Class<?>> entityTypes,
-            final @NonNull Map<String, String> dnSettings) {
-
-        if(_NullSafe.isEmpty(entityTypes)) {
-            return; // skip
-        }
-
-        val pmf = (JDOPersistenceManagerFactory) persistenceManagerFactory;
-        val nucleusContext = pmf.getNucleusContext();
-        val schemaAwareStoreManager = (SchemaAwareStoreManager)nucleusContext.getStoreManager();
-
-        val classNames = entityTypes
-                .stream()
-                .map(Class::getName)
-                .collect(Collectors.toSet());
-
-        val properties = new Properties();
-        properties.putAll(dnSettings);
-        schemaAwareStoreManager.createSchemaForClasses(classNames, properties);
-
-        val clr = nucleusContext.getClassLoaderResolver(_Context.getDefaultClassLoader());
-        val metaDataManager = nucleusContext.getMetaDataManager();
-
-        metaDataManager
-        .getClassesWithMetaData()
-        .forEach(className->{
-            val meta = metaDataManager.getMetaDataForClass(className, clr);
-            _NullSafe.stream(meta.getQueries())
-            .forEach(metaDataManager::registerNamedQuery);
-        });
-
-    }
-
-}
diff --git a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/config/JdoEntityDiscoveryListener.java b/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/config/JdoEntityDiscoveryListener.java
index 389a11e51d..632aa889c8 100644
--- a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/config/JdoEntityDiscoveryListener.java
+++ b/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/config/JdoEntityDiscoveryListener.java
@@ -23,11 +23,27 @@ import java.util.Set;
 
 import javax.jdo.PersistenceManagerFactory;
 
+/**
+ * Any implementations will be called during bootstrapping, after the {@link PersistenceManagerFactory} has been
+ * created.
+ *
+ * <p>
+ *     This is a good way to perform any eager initialization.  However, for the specific use case of creating the
+ *     database tables (eg if integration testing) a better approach is to simply set the
+ *     {@link org.apache.isis.core.config.DatanucleusConfiguration.Schema.Generatedatabase#setMode(String) datanucleus.schema.generatedatabase.mode}
+ *     configuration property; there's no need to implement a listener for this use case.
+ * </p>
+ */
 public interface JdoEntityDiscoveryListener {
 
+    /**
+     * Called during bootstrapping
+     *
+     * @param properties - both "datanucleus.*" and "javax.jdo.*".
+     */
     public void onEntitiesDiscovered(
             PersistenceManagerFactory persistenceManagerFactory,
             Set<Class<?>> entityTypes,
-            Map<String, String> dnSettings);
+            Map<String, String> properties);
 
 }