You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by vl...@apache.org on 2026/04/05 18:52:37 UTC
(tapestry-5) 01/01: Separate tapestry-jpa-core from tapestry-jpa
This is an automated email from the ASF dual-hosted git repository.
vlamp pushed a commit to branch jpa-core-TAP5-2824
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
commit 428a60141547e066dbeaa544e5b26d8adc89946d
Author: Volker Lamp <vl...@apache.org>
AuthorDate: Sun Apr 5 20:43:45 2026 +0200
Separate tapestry-jpa-core from tapestry-jpa
---
settings.gradle | 1 +
.../apache/tapestry5/modules/TapestryModule.java | 2 +-
.../src/main/typescript/package-lock.json | 1 -
.../tapestry5/ioc/modules/TapestryIOCModule.java | 18 ++
tapestry-jpa-core/LICENSE.txt | 202 +++++++++++++++++++++
tapestry-jpa-core/NOTICE.txt | 12 ++
tapestry-jpa-core/build.gradle | 28 +++
.../jpa/core}/CommitAfterMethodAdvice.java | 6 +-
.../jpa/core}/EntityManagerManagerImpl.java | 8 +-
.../jpa/core}/EntityManagerObjectProvider.java | 8 +-
.../jpa/core}/EntityManagerSourceImpl.java | 29 +--
.../jpa/core}/EntityTransactionManagerImpl.java | 6 +-
.../internal/jpa/core/JpaCoreInternalUtils.java | 27 +--
.../jpa/core}/JpaTransactionAdvisorImpl.java | 12 +-
.../internal/jpa/core}/NoopAnnotatedType.java | 2 +-
.../internal/jpa/core}/NoopBeanManager.java | 2 +-
.../internal/jpa/core}/NoopCreationalContext.java | 2 +-
.../internal/jpa/core}/NoopInjectionTarget.java | 2 +-
.../PackageNamePersistenceUnitConfigurer.java | 10 +-
.../jpa/core}/PersistenceContentHandler.java | 6 +-
...nceContextSpecificEntityTransactionManager.java | 4 +-
.../internal/jpa/core}/PersistenceParser.java | 6 +-
.../jpa/core}/PersistenceUnitInfoImpl.java | 6 +-
...apestryCDIBeanManagerForJPAEntityListeners.java | 2 +-
.../tapestry5/jpa/core}/EntityManagerManager.java | 2 +-
.../tapestry5/jpa/core}/EntityManagerSource.java | 2 +-
.../jpa/core}/EntityTransactionManager.java | 2 +-
.../tapestry5/jpa/core/JpaCoreConstants.java | 18 +-
.../apache/tapestry5/jpa/core/JpaCoreSymbols.java | 38 ++++
.../jpa/core}/JpaEntityPackageManager.java | 2 +-
.../tapestry5/jpa/core}/JpaTransactionAdvisor.java | 4 +-
.../jpa/core}/PersistenceUnitConfigurer.java | 4 +-
.../jpa/core}/TapestryPersistenceUnitInfo.java | 4 +-
.../jpa/core}/annotations/CommitAfter.java | 4 +-
.../jpa/core}/annotations/package-info.java | 6 +-
.../tapestry5/jpa/core/modules/JpaCoreModule.java | 119 ++++++++++++
.../jpa/core}/EntityManagerSourceImplTest.java | 14 +-
.../jpa/core}/JpaTransactionAdvisorImplTest.java | 13 +-
...-persistence-units-include-unlisted-classes.xml | 0
tapestry-jpa/build.gradle | 1 +
.../tapestry5/internal/jpa/CommitAfterWorker.java | 9 +-
.../EntityApplicationStatePersistenceStrategy.java | 4 +-
.../jpa/EntityPersistentFieldStrategy.java | 4 +-
.../tapestry5/internal/jpa/JpaInternalUtils.java | 24 +--
.../tapestry5/internal/jpa/JpaValueEncoder.java | 4 +-
.../tapestry5/internal/jpa/PersistedEntity.java | 4 +-
.../internal/jpa/PersistenceContextWorker.java | 4 +-
.../apache/tapestry5/jpa/modules/JpaModule.java | 68 ++-----
.../apache/tapestry5/jpa/test/CommitCounter.java | 2 +-
.../org/apache/tapestry5/jpa/test/JpaTest.java | 2 +-
.../apache/tapestry5/jpa/test/JpaTestModule.java | 12 +-
.../apache/tapestry5/jpa/test/NestedService.java | 2 +-
.../apache/tapestry5/jpa/test/TopLevelService.java | 2 +-
.../tapestry5/jpa/test/TopLevelServiceImpl.java | 4 +-
.../org/example/app1/pages/CommitAfterDemo.java | 2 +-
.../org/example/app1/pages/EncodeEntities.java | 4 +-
.../test/java/org/example/app1/pages/GridDemo.java | 2 +-
.../java/org/example/app1/pages/PersistEntity.java | 2 +-
.../java/org/example/app1/pages/PersistThang.java | 2 +-
.../java/org/example/app1/services/AppModule.java | 8 +-
.../java/org/example/app1/services/UserDAO.java | 2 +-
.../java/org/example/app2/pages/PersistItem.java | 4 +-
.../java/org/example/app2/pages/PersistItem2.java | 4 +-
.../java/org/example/app2/pages/PersistItem3.java | 2 +-
.../java/org/example/app3/pages/PersistThing.java | 4 +-
.../java/org/example/app3/services/AppModule.java | 6 +-
.../java/org/example/app4/pages/PersistAll.java | 4 +-
.../org/example/app6/pages/CommitAfterDemo.java | 2 +-
.../org/example/app6/pages/EncodeEntities.java | 2 +-
.../test/java/org/example/app6/pages/GridDemo.java | 2 +-
.../java/org/example/app6/pages/PersistEntity.java | 2 +-
.../java/org/example/app6/pages/PersistThang.java | 2 +-
.../java/org/example/app6/services/AppModule.java | 8 +-
.../java/org/example/app6/services/UserDAO.java | 2 +-
.../example/app6/services/impl/UserDAOImpl.java | 2 +-
75 files changed, 598 insertions(+), 250 deletions(-)
diff --git a/settings.gradle b/settings.gradle
index 5bbd41fc4..f44d5b8e1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -36,6 +36,7 @@ include('plastic',
'tapestry-upload',
'tapestry-beanvalidator',
'tapestry-jpa',
+ 'tapestry-jpa-core',
'tapestry-kaptcha',
//'quickstart',
'tapestry-clojure',
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
index 0709fd572..622df1774 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
@@ -1213,7 +1213,7 @@ public final class TapestryModule
return assetSource.resourceForPath(input);
}
});
- configuration.add(stringToResource.getKey(), stringToResource);
+ configuration.override(stringToResource.getKey(), stringToResource);
CoercionTuple<Renderable, RenderCommand> renderableToRenderCommand = CoercionTuple.create(Renderable.class, RenderCommand.class,
new Coercion<Renderable, RenderCommand>()
diff --git a/tapestry-core/src/main/typescript/package-lock.json b/tapestry-core/src/main/typescript/package-lock.json
index de9f7e7ca..336639a5d 100644
--- a/tapestry-core/src/main/typescript/package-lock.json
+++ b/tapestry-core/src/main/typescript/package-lock.json
@@ -369,7 +369,6 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
"integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
"dev": true,
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
index 2aeed2235..4f739e94b 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
@@ -60,6 +60,7 @@ import org.apache.tapestry5.ioc.internal.services.ThunkCreatorImpl;
import org.apache.tapestry5.ioc.internal.services.UpdateListenerHubImpl;
import org.apache.tapestry5.ioc.internal.services.ValueObjectProvider;
import org.apache.tapestry5.ioc.internal.services.cron.PeriodicExecutorImpl;
+import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.services.ApplicationDefaults;
import org.apache.tapestry5.ioc.services.AspectDecorator;
@@ -312,6 +313,23 @@ public final class TapestryIOCModule
BasicTypeCoercions.provideJSR310TypeCoercions(configuration);
}
+ @Contribute(TypeCoercer.class)
+ public static void provideAdditionalCoercions(MappedConfiguration<CoercionTuple.Key, CoercionTuple> configuration)
+ {
+ Coercion<String, Resource> stringToResource = new Coercion<String, Resource>()
+ {
+ @Override
+ public Resource coerce(String input)
+ {
+ return new ClasspathResource(input);
+ }
+ };
+
+ CoercionTuple<String, Resource> stringToResourceTuple = CoercionTuple.create(String.class, Resource.class, stringToResource);
+
+ configuration.add(stringToResourceTuple.getKey(), stringToResourceTuple);
+ }
+
/**
* <dl>
* <dt>SystemProperties</dt>
diff --git a/tapestry-jpa-core/LICENSE.txt b/tapestry-jpa-core/LICENSE.txt
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/tapestry-jpa-core/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
diff --git a/tapestry-jpa-core/NOTICE.txt b/tapestry-jpa-core/NOTICE.txt
new file mode 100644
index 000000000..2ee18498c
--- /dev/null
+++ b/tapestry-jpa-core/NOTICE.txt
@@ -0,0 +1,12 @@
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+Please refer to the NOTICE.txt in each sub-module to
+identify further dependencies.
+
+The Maven central repository is the prefered method to download Tapestry
+and its dependencies. The binary archive includes just basic
+dependencies for tapestry-core; using other modules (such as
+tapestry-hibernate or any of the others) requires downloading
+additional dependencies. Please refer to the Maven POM for each module
+to identify its dependencies.
diff --git a/tapestry-jpa-core/build.gradle b/tapestry-jpa-core/build.gradle
new file mode 100644
index 000000000..9f71dc319
--- /dev/null
+++ b/tapestry-jpa-core/build.gradle
@@ -0,0 +1,28 @@
+plugins {
+ id 'tapestry.junit5-spock-convention'
+ id 'groovy'
+}
+
+description = 'Provides support for JPA without a dependency on tapestry-core'
+
+dependencies {
+ api libs.jakarta.persistence.api
+ implementation libs.jakarta.cdi.api
+
+ implementation project(':commons')
+ implementation project(':tapestry-ioc')
+
+ testImplementation project(':tapestry-spock')
+ testImplementation project(':tapestry-test')
+
+ testImplementation libs.eclipselink
+
+ testRuntimeOnly libs.dbcp
+ testRuntimeOnly libs.h2
+}
+
+tasks.named('jar', Jar) {
+ manifest {
+ attributes 'Tapestry-Module-Classes': 'org.apache.tapestry5.jpa.core.modules.JpaCoreModule'
+ }
+}
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/CommitAfterMethodAdvice.java
similarity index 88%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/CommitAfterMethodAdvice.java
index d73444467..ed50791d2 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/CommitAfterMethodAdvice.java
@@ -1,4 +1,4 @@
-// Copyright 2011, 2012, 2014 The Apache Software Foundation
+// Copyright 2011, 2012, 2014, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import org.apache.tapestry5.ioc.Invokable;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
import org.apache.tapestry5.plastic.MethodAdvice;
import org.apache.tapestry5.plastic.MethodInvocation;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerManagerImpl.java
similarity index 93%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerManagerImpl.java
index 77a2ef5bb..2c4d5be41 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerManagerImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.util.Collections;
import java.util.Map;
@@ -23,8 +23,8 @@ import jakarta.persistence.spi.PersistenceUnitInfo;
import org.apache.tapestry5.commons.util.CollectionFactory;
import org.apache.tapestry5.ioc.services.ThreadCleanupListener;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
import org.slf4j.Logger;
public class EntityManagerManagerImpl implements EntityManagerManager, ThreadCleanupListener
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerObjectProvider.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerObjectProvider.java
similarity index 91%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerObjectProvider.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerObjectProvider.java
index 004e7bb94..692c0e978 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerObjectProvider.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerObjectProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.util.HashMap;
import java.util.Map;
@@ -25,7 +25,7 @@ import org.apache.tapestry5.commons.ObjectCreator;
import org.apache.tapestry5.commons.ObjectLocator;
import org.apache.tapestry5.commons.ObjectProvider;
import org.apache.tapestry5.commons.services.PlasticProxyFactory;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
public class EntityManagerObjectProvider implements ObjectProvider
{
@@ -64,7 +64,7 @@ public class EntityManagerObjectProvider implements ObjectProvider
final EntityManagerManager entityManagerManager = objectLocator
.getService(EntityManagerManager.class);
- return JpaInternalUtils.getEntityManager(entityManagerManager, annotation);
+ return JpaCoreInternalUtils.getEntityManager(entityManagerManager, annotation);
}
}, "<EntityManagerProxy>");
emProxyByName.put(unitName, proxy);
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImpl.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImpl.java
similarity index 91%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImpl.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImpl.java
index b819d1a96..eb130b135 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImpl.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,8 +12,11 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
@@ -29,6 +32,7 @@ import jakarta.persistence.spi.PersistenceProviderResolverHolder;
import jakarta.persistence.spi.PersistenceUnitInfo;
import org.apache.tapestry5.commons.Resource;
+import org.apache.tapestry5.commons.services.TypeCoercer;
import org.apache.tapestry5.commons.util.CollectionFactory;
import org.apache.tapestry5.func.F;
import org.apache.tapestry5.func.Mapper;
@@ -37,12 +41,13 @@ import org.apache.tapestry5.ioc.annotations.Local;
import org.apache.tapestry5.ioc.annotations.PostInjection;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
import org.apache.tapestry5.ioc.services.RegistryShutdownHub;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.JpaConstants;
-import org.apache.tapestry5.jpa.JpaSymbols;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.JpaCoreConstants;
+import org.apache.tapestry5.jpa.core.JpaCoreSymbols;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
import org.slf4j.Logger;
public class EntityManagerSourceImpl implements EntityManagerSource
@@ -54,10 +59,10 @@ public class EntityManagerSourceImpl implements EntityManagerSource
private final List<TapestryPersistenceUnitInfo> persistenceUnitInfos;
- public EntityManagerSourceImpl(Logger logger, @Symbol(JpaSymbols.PERSISTENCE_DESCRIPTOR)
- final Resource persistenceDescriptor, @Local
- PersistenceUnitConfigurer packageNamePersistenceUnitConfigurer,
- Map<String, PersistenceUnitConfigurer> configuration)
+ public EntityManagerSourceImpl(Logger logger,
+ @Symbol(JpaCoreSymbols.PERSISTENCE_DESCRIPTOR) Resource persistenceDescriptor,
+ @Local PersistenceUnitConfigurer packageNamePersistenceUnitConfigurer,
+ Map<String, PersistenceUnitConfigurer> configuration)
{
this.logger = logger;
@@ -215,7 +220,7 @@ public class EntityManagerSourceImpl implements EntityManagerSource
if (info.getPersistenceUnitName().equals(persistenceUnitName))
{
final Map properties = info.getEntityManagerProperties() == null ? CollectionFactory.newCaseInsensitiveMap() : info.getEntityManagerProperties();
- properties.put(JpaConstants.PERSISTENCE_UNIT_NAME, persistenceUnitName);
+ properties.put(JpaCoreConstants.PERSISTENCE_UNIT_NAME, persistenceUnitName);
String providerClassName = info.getPersistenceProviderClassName();
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityTransactionManagerImpl.java
similarity index 96%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityTransactionManagerImpl.java
index 31b09b0e9..b1d8c8039 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityTransactionManagerImpl.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.util.HashMap;
import java.util.Map;
@@ -21,8 +21,8 @@ import jakarta.persistence.EntityManager;
import org.apache.tapestry5.ioc.Invokable;
import org.apache.tapestry5.ioc.ScopeConstants;
import org.apache.tapestry5.ioc.annotations.Scope;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
import org.slf4j.Logger;
@Scope(ScopeConstants.PERTHREAD)
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaCoreInternalUtils.java
similarity index 75%
copy from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
copy to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaCoreInternalUtils.java
index 4b8b0ffe7..f054bd7d7 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaCoreInternalUtils.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.util.Map;
import java.util.Set;
@@ -24,28 +24,11 @@ import jakarta.persistence.metamodel.EntityType;
import jakarta.persistence.metamodel.Metamodel;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.JpaConstants;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.JpaCoreConstants;
-public class JpaInternalUtils
+public class JpaCoreInternalUtils
{
- public static PersistedEntity convertApplicationValueToPersisted(
- final EntityManagerManager entityManagerManager, final Object newValue)
- {
- final EntityManager em = getEntityManagerFactory(entityManagerManager, newValue);
-
- final EntityManagerFactory emf = em.getEntityManagerFactory();
-
- final Map<String, Object> properties = emf.getProperties();
-
- final String persistenceUnitName = (String) properties
- .get(JpaConstants.PERSISTENCE_UNIT_NAME);
-
- final Object id = emf.getPersistenceUnitUtil().getIdentifier(newValue);
-
- return new PersistedEntity(newValue.getClass(), id, persistenceUnitName);
- }
-
private static EntityManager getEntityManagerFactory(
final EntityManagerManager entityManagerManager, final Object entity)
{
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImpl.java
similarity index 85%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImpl.java
index 4b29e849f..43ef62a47 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2015 The Apache Software Foundation
+// Copyright 2015, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.lang.reflect.Method;
import java.util.HashMap;
@@ -22,10 +22,10 @@ import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.ioc.MethodAdviceReceiver;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.apache.tapestry5.plastic.MethodAdvice;
public class JpaTransactionAdvisorImpl implements JpaTransactionAdvisor
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopAnnotatedType.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopAnnotatedType.java
similarity index 97%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopAnnotatedType.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopAnnotatedType.java
index a0d675c89..46bad1f69 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopAnnotatedType.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopAnnotatedType.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopBeanManager.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopBeanManager.java
similarity index 99%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopBeanManager.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopBeanManager.java
index 6b1e4833d..e4e95ad8b 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopBeanManager.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopBeanManager.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopCreationalContext.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopCreationalContext.java
similarity index 94%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopCreationalContext.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopCreationalContext.java
index 1a1f57541..9d70ba299 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopCreationalContext.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopCreationalContext.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import jakarta.enterprise.context.spi.CreationalContext;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopInjectionTarget.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopInjectionTarget.java
similarity index 97%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopInjectionTarget.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopInjectionTarget.java
index 06e727b06..0109835f7 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopInjectionTarget.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopInjectionTarget.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.util.Set;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PackageNamePersistenceUnitConfigurer.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PackageNamePersistenceUnitConfigurer.java
similarity index 83%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PackageNamePersistenceUnitConfigurer.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PackageNamePersistenceUnitConfigurer.java
index f85d598c4..a2c71d506 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PackageNamePersistenceUnitConfigurer.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PackageNamePersistenceUnitConfigurer.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,12 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import org.apache.tapestry5.ioc.services.ClassNameLocator;
-import org.apache.tapestry5.jpa.JpaEntityPackageManager;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.JpaEntityPackageManager;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
public class PackageNamePersistenceUnitConfigurer implements PersistenceUnitConfigurer
{
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContentHandler.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContentHandler.java
similarity index 94%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContentHandler.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContentHandler.java
index a27c67ab4..34d718029 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContentHandler.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContentHandler.java
@@ -1,4 +1,4 @@
-// Copyright 2011, 2014 The Apache Software Foundation
+// Copyright 2011, 2014, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,13 +12,13 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.util.Arrays;
import java.util.List;
import org.apache.tapestry5.commons.util.CollectionFactory;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContextSpecificEntityTransactionManager.java
similarity index 98%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContextSpecificEntityTransactionManager.java
index 096206269..401d0deac 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContextSpecificEntityTransactionManager.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.util.ArrayDeque;
import java.util.ArrayList;
@@ -23,7 +23,7 @@ import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
import org.apache.tapestry5.ioc.Invokable;
-import org.apache.tapestry5.jpa.EntityTransactionManager.VoidInvokable;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager.VoidInvokable;
import org.slf4j.Logger;
public class PersistenceContextSpecificEntityTransactionManager
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceParser.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceParser.java
similarity index 89%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceParser.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceParser.java
index cf2402fb0..1fa78a1d4 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceParser.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceParser.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitInfoImpl.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceUnitInfoImpl.java
similarity index 98%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitInfoImpl.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceUnitInfoImpl.java
index c0235d850..ccc0c5e7b 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitInfoImpl.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceUnitInfoImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import org.apache.tapestry5.commons.util.CollectionFactory;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
import javax.naming.Context;
import javax.naming.InitialContext;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/TapestryCDIBeanManagerForJPAEntityListeners.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/TapestryCDIBeanManagerForJPAEntityListeners.java
similarity index 98%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/TapestryCDIBeanManagerForJPAEntityListeners.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/TapestryCDIBeanManagerForJPAEntityListeners.java
index c608abf43..ccc8970d4 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/TapestryCDIBeanManagerForJPAEntityListeners.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/TapestryCDIBeanManagerForJPAEntityListeners.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.lang.reflect.Method;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerManager.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerManager.java
similarity index 97%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerManager.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerManager.java
index 699d22b9d..53a628f7b 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerManager.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerManager.java
@@ -10,7 +10,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
import jakarta.persistence.EntityManager;
import java.util.Map;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerSource.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerSource.java
similarity index 97%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerSource.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerSource.java
index a52852c96..a2ba7e207 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerSource.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerSource.java
@@ -10,7 +10,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityTransactionManager.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityTransactionManager.java
similarity index 97%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityTransactionManager.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityTransactionManager.java
index e8b2ae1c4..13eef2ca5 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityTransactionManager.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityTransactionManager.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
import org.apache.tapestry5.ioc.Invokable;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreConstants.java
similarity index 55%
copy from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
copy to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreConstants.java
index d1acafe15..3d40c8e5e 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreConstants.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,21 +12,17 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
/**
- * Used to configure a {@linkplain jakarta.persistence.spi.PersistenceUnitInfo}, which is used to
- * create an {@linkplain jakarta.persistence.EntityManagerFactory}.
- *
+ * Defines constants used inside the Tapestry JPA integration.
+ *
* @since 5.3
*/
-public interface PersistenceUnitConfigurer
+public class JpaCoreConstants
{
/**
- * Configures a persistence unit.
- *
- * @param unitInfo
- * represents a persistence unit to configure
+ * Name of the <code>EntityManager</code> property whose value is the name of a persistence unit.
*/
- void configure(TapestryPersistenceUnitInfo unitInfo);
+ public static final String PERSISTENCE_UNIT_NAME = "tapestry.persistence-unit-name";
}
diff --git a/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreSymbols.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreSymbols.java
new file mode 100644
index 000000000..ababe0442
--- /dev/null
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreSymbols.java
@@ -0,0 +1,38 @@
+// Copyright 2011, 2026 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.jpa.core;
+
+/**
+ * Configuration symbols, for use with contributions to {@link org.apache.tapestry5.ioc.services.ApplicationDefaults}.
+ *
+ * @since 5.3
+ */
+public class JpaCoreSymbols
+{
+ /**
+ * If "true", then JPA will be started up at application launch, rather than lazily.
+ *
+ * @since 5.3
+ */
+ public static final String EARLY_START_UP = "tapestry.jpa.early-startup";
+
+ /**
+ * The location of the persistence configuration file, located on the classpath. This
+ * will normally be <code>/META-INF/persistence.xml</code>.
+ *
+ * @since 5.3
+ */
+ public static final String PERSISTENCE_DESCRIPTOR = "tapestry.jpa.persistence-descriptor";
+}
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaEntityPackageManager.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaEntityPackageManager.java
similarity index 96%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaEntityPackageManager.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaEntityPackageManager.java
index a4d28dc55..47d032aa3 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaEntityPackageManager.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaEntityPackageManager.java
@@ -10,7 +10,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
import org.apache.tapestry5.ioc.annotations.UsesConfiguration;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaTransactionAdvisor.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaTransactionAdvisor.java
similarity index 93%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaTransactionAdvisor.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaTransactionAdvisor.java
index 10957b524..7c717304d 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaTransactionAdvisor.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaTransactionAdvisor.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
import org.apache.tapestry5.ioc.MethodAdviceReceiver;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/PersistenceUnitConfigurer.java
similarity index 91%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/PersistenceUnitConfigurer.java
index d1acafe15..5c390ec67 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/PersistenceUnitConfigurer.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
/**
* Used to configure a {@linkplain jakarta.persistence.spi.PersistenceUnitInfo}, which is used to
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/TapestryPersistenceUnitInfo.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/TapestryPersistenceUnitInfo.java
similarity index 98%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/TapestryPersistenceUnitInfo.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/TapestryPersistenceUnitInfo.java
index b930ca9cb..b470100c9 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/TapestryPersistenceUnitInfo.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/TapestryPersistenceUnitInfo.java
@@ -1,4 +1,4 @@
-// Copyright 2011, 2014 The Apache Software Foundation
+// Copyright 2011, 2014, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
import jakarta.persistence.SharedCacheMode;
import jakarta.persistence.ValidationMode;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/CommitAfter.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/CommitAfter.java
similarity index 91%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/CommitAfter.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/CommitAfter.java
index e715b7cfe..e2c9d965e 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/CommitAfter.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/CommitAfter.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.jpa.annotations;
+package org.apache.tapestry5.jpa.core.annotations;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/package-info.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/package-info.java
similarity index 81%
rename from tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/package-info.java
rename to tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/package-info.java
index 7f8523063..869eff0b1 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/package-info.java
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/package-info.java
@@ -1,4 +1,4 @@
-// Copyright 2012 The Apache Software Foundation
+// Copyright 2012, 2026The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -13,6 +13,6 @@
// limitations under the License.
/**
- * JPA annotations
+ * JPA Core annotations
*/
-package org.apache.tapestry5.jpa.annotations;
+package org.apache.tapestry5.jpa.core.annotations;
diff --git a/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/modules/JpaCoreModule.java b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/modules/JpaCoreModule.java
new file mode 100644
index 000000000..be05207a1
--- /dev/null
+++ b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/modules/JpaCoreModule.java
@@ -0,0 +1,119 @@
+// Copyright 2011-2014, 2026 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.jpa.core.modules;
+
+import java.util.Collection;
+
+import jakarta.persistence.EntityManagerFactory;
+import jakarta.persistence.metamodel.EntityType;
+import jakarta.persistence.metamodel.Metamodel;
+import jakarta.persistence.spi.PersistenceUnitInfo;
+
+import org.apache.tapestry5.commons.Configuration;
+import org.apache.tapestry5.commons.MappedConfiguration;
+import org.apache.tapestry5.commons.ObjectProvider;
+import org.apache.tapestry5.commons.OrderedConfiguration;
+import org.apache.tapestry5.commons.services.PropertyAccess;
+import org.apache.tapestry5.commons.services.TypeCoercer;
+import org.apache.tapestry5.internal.jpa.core.EntityManagerManagerImpl;
+import org.apache.tapestry5.internal.jpa.core.EntityManagerObjectProvider;
+import org.apache.tapestry5.internal.jpa.core.EntityManagerSourceImpl;
+import org.apache.tapestry5.internal.jpa.core.EntityTransactionManagerImpl;
+import org.apache.tapestry5.internal.jpa.core.JpaTransactionAdvisorImpl;
+import org.apache.tapestry5.internal.jpa.core.PackageNamePersistenceUnitConfigurer;
+import org.apache.tapestry5.ioc.LoggerSource;
+import org.apache.tapestry5.ioc.ScopeConstants;
+import org.apache.tapestry5.ioc.ServiceBinder;
+import org.apache.tapestry5.ioc.annotations.Contribute;
+import org.apache.tapestry5.ioc.annotations.Primary;
+import org.apache.tapestry5.ioc.annotations.Scope;
+import org.apache.tapestry5.ioc.annotations.Startup;
+import org.apache.tapestry5.ioc.annotations.Symbol;
+import org.apache.tapestry5.ioc.services.FactoryDefaults;
+import org.apache.tapestry5.ioc.services.MasterObjectProvider;
+import org.apache.tapestry5.ioc.services.PerthreadManager;
+import org.apache.tapestry5.ioc.services.SymbolProvider;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.JpaEntityPackageManager;
+import org.apache.tapestry5.jpa.core.JpaCoreSymbols;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.slf4j.Logger;
+
+/**
+ * Defines core services for JPA support.
+ *
+ * @since 5.3
+ */
+public class JpaCoreModule
+{
+ public static void bind(final ServiceBinder binder)
+ {
+ binder.bind(JpaTransactionAdvisor.class, JpaTransactionAdvisorImpl.class);
+ binder.bind(PersistenceUnitConfigurer.class, PackageNamePersistenceUnitConfigurer.class).withSimpleId();
+ binder.bind(EntityManagerSource.class, EntityManagerSourceImpl.class);
+ binder.bind(EntityTransactionManager.class, EntityTransactionManagerImpl.class);
+ }
+
+ public static JpaEntityPackageManager buildJpaEntityPackageManager(final Collection<String> packageNames)
+ {
+ return new JpaEntityPackageManager()
+ {
+ @Override
+ public Collection<String> getPackageNames()
+ {
+ return packageNames;
+ }
+ };
+ }
+
+ @Scope(ScopeConstants.PERTHREAD)
+ public static EntityManagerManager buildEntityManagerManager(final EntityManagerSource entityManagerSource,
+ final PerthreadManager perthreadManager, final Logger logger)
+ {
+ final EntityManagerManagerImpl service = new EntityManagerManagerImpl(entityManagerSource, logger);
+
+ perthreadManager.addThreadCleanupListener(service);
+
+ return service;
+ }
+
+ @Contribute(MasterObjectProvider.class)
+ public static void provideObjectProviders(final OrderedConfiguration<ObjectProvider> configuration)
+ {
+ configuration.addInstance("EntityManager", EntityManagerObjectProvider.class,
+ "before:AnnotationBasedContributions");
+ }
+
+ @Contribute(SymbolProvider.class)
+ @FactoryDefaults
+ public static void provideFactoryDefaults(final MappedConfiguration<String, String> configuration)
+ {
+ configuration.add(JpaCoreSymbols.EARLY_START_UP, "true");
+ configuration.add(JpaCoreSymbols.PERSISTENCE_DESCRIPTOR, "/META-INF/persistence.xml");
+ }
+
+ @Startup
+ public static void startupEarly(final EntityManagerManager entityManagerManager, @Symbol(JpaCoreSymbols.EARLY_START_UP)
+ final boolean earlyStartup)
+ {
+ if (earlyStartup)
+ {
+ entityManagerManager.getEntityManagers();
+ }
+ }
+}
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImplTest.java b/tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImplTest.java
similarity index 90%
rename from tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImplTest.java
rename to tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImplTest.java
index 61c0be72a..9af6c9f47 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImplTest.java
+++ b/tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImplTest.java
@@ -1,4 +1,4 @@
-// Copyright 2011-2014 The Apache Software Foundation
+// Copyright 2011-2014, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,13 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import org.apache.tapestry5.commons.util.CollectionFactory;
import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
-import org.apache.tapestry5.test.TapestryTestCase;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.internal.jpa.core.EntityManagerSourceImpl;
+import org.apache.tapestry5.ioc.test.IOCTestCase;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
@@ -28,7 +29,7 @@ import jakarta.persistence.spi.PersistenceUnitTransactionType;
import java.util.HashMap;
import java.util.Map;
-public class EntityManagerSourceImplTest extends TapestryTestCase
+public class EntityManagerSourceImplTest extends IOCTestCase
{
@Test
public void multiple_persistence_units_include_unlisted_classes()
@@ -95,5 +96,4 @@ public class EntityManagerSourceImplTest extends TapestryTestCase
persistenceUnitFile), null, configurerMap);
return emSource;
}
-
}
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java b/tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImplTest.java
similarity index 97%
rename from tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
rename to tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImplTest.java
index 558ea8dbc..8de7f2205 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
+++ b/tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImplTest.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
import java.sql.SQLException;
import java.util.Map;
@@ -27,10 +27,11 @@ import org.apache.tapestry5.ioc.Registry;
import org.apache.tapestry5.ioc.services.AspectDecorator;
import org.apache.tapestry5.ioc.services.AspectInterceptorBuilder;
import org.apache.tapestry5.ioc.test.IOCTestCase;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.internal.jpa.core.JpaTransactionAdvisorImpl;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.apache.tapestry5.test.ioc.TestBase;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
diff --git a/tapestry-jpa/src/test/resources/multiple-persistence-units-include-unlisted-classes.xml b/tapestry-jpa-core/src/test/resources/multiple-persistence-units-include-unlisted-classes.xml
similarity index 100%
rename from tapestry-jpa/src/test/resources/multiple-persistence-units-include-unlisted-classes.xml
rename to tapestry-jpa-core/src/test/resources/multiple-persistence-units-include-unlisted-classes.xml
diff --git a/tapestry-jpa/build.gradle b/tapestry-jpa/build.gradle
index 0f7ff48e5..4e360f78f 100644
--- a/tapestry-jpa/build.gradle
+++ b/tapestry-jpa/build.gradle
@@ -6,6 +6,7 @@ description = 'Provides support for simple CRUD applications built on top of Tap
dependencies {
implementation project(':tapestry-core')
+ implementation project(':tapestry-jpa-core')
api libs.jakarta.persistence.api
implementation libs.jakarta.cdi.api
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
index 0df0b963a..85fd35eae 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
@@ -1,4 +1,4 @@
-// Copyright 2011, 2014 The Apache Software Foundation
+// Copyright 2011, 2014, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -20,9 +20,10 @@ import java.util.Map;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.internal.jpa.core.CommitAfterMethodAdvice;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.plastic.MethodAdvice;
import org.apache.tapestry5.plastic.PlasticClass;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
index 7566ea43d..f61dbcb56 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@ package org.apache.tapestry5.internal.jpa;
import org.apache.tapestry5.http.services.Request;
import org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
import org.apache.tapestry5.services.ApplicationStateCreator;
public class EntityApplicationStatePersistenceStrategy extends
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityPersistentFieldStrategy.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityPersistentFieldStrategy.java
index a49230f56..1f00078a2 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityPersistentFieldStrategy.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityPersistentFieldStrategy.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@ package org.apache.tapestry5.internal.jpa;
import org.apache.tapestry5.http.services.Request;
import org.apache.tapestry5.internal.services.AbstractSessionPersistentFieldStrategy;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
/**
* Persists JPA entities by storing their id in the session.
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
index 4b8b0ffe7..2629ffa12 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -23,11 +23,12 @@ import jakarta.persistence.PersistenceContext;
import jakarta.persistence.metamodel.EntityType;
import jakarta.persistence.metamodel.Metamodel;
+import org.apache.tapestry5.internal.jpa.core.JpaCoreInternalUtils;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
import org.apache.tapestry5.jpa.JpaConstants;
-public class JpaInternalUtils
+public class JpaInternalUtils extends JpaCoreInternalUtils
{
public static PersistedEntity convertApplicationValueToPersisted(
final EntityManagerManager entityManagerManager, final Object newValue)
@@ -76,21 +77,4 @@ public class JpaInternalUtils
"Failed persisting the entity. The entity '%s' does not belong to any of the existing persistence contexts.",
entity));
}
-
- public static EntityManager getEntityManager(EntityManagerManager entityManagerManager,
- PersistenceContext annotation)
- {
- String unitName = annotation == null ? null : annotation.unitName();
-
- if (InternalUtils.isNonBlank(unitName))
- return entityManagerManager.getEntityManager(unitName);
-
- Map<String, EntityManager> entityManagers = entityManagerManager.getEntityManagers();
-
- if (entityManagers.size() == 1)
- return entityManagers.values().iterator().next();
-
- throw new RuntimeException("Unable to locate a single EntityManager. " +
- "You must provide the persistence unit name as defined in the persistence.xml using the @PersistenceContext annotation.");
- }
}
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaValueEncoder.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaValueEncoder.java
index 7bf678aa0..357c45fec 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaValueEncoder.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaValueEncoder.java
@@ -1,4 +1,4 @@
-// Copyright 2011-2013 The Apache Software Foundation
+// Copyright 2011-2013, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ import org.apache.tapestry5.commons.services.PropertyAdapter;
import org.apache.tapestry5.commons.services.TypeCoercer;
import org.apache.tapestry5.commons.util.ExceptionUtils;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
import org.slf4j.Logger;
import jakarta.persistence.EntityManager;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistedEntity.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistedEntity.java
index 0e6817ab7..10deedc96 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistedEntity.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistedEntity.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@ import java.io.Serializable;
import jakarta.persistence.EntityManager;
import org.apache.tapestry5.http.annotations.ImmutableSessionPersistedObject;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
/**
* Encapsulates a JPA entity name with an entity id.
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextWorker.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextWorker.java
index fbb05bca2..3e111a25f 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextWorker.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextWorker.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
package org.apache.tapestry5.internal.jpa;
import org.apache.tapestry5.internal.transform.ReadOnlyComponentFieldConduit;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.plastic.InstanceContext;
import org.apache.tapestry5.plastic.PlasticClass;
diff --git a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java b/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
index cdc0b225a..2e371ecc9 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
@@ -1,4 +1,4 @@
-// Copyright 2011-2014 The Apache Software Foundation
+// Copyright 2011-2014, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -31,20 +31,16 @@ import org.apache.tapestry5.commons.services.TypeCoercer;
import org.apache.tapestry5.http.internal.TapestryHttpInternalConstants;
import org.apache.tapestry5.internal.jpa.CommitAfterWorker;
import org.apache.tapestry5.internal.jpa.EntityApplicationStatePersistenceStrategy;
-import org.apache.tapestry5.internal.jpa.EntityManagerManagerImpl;
-import org.apache.tapestry5.internal.jpa.EntityManagerObjectProvider;
-import org.apache.tapestry5.internal.jpa.EntityManagerSourceImpl;
import org.apache.tapestry5.internal.jpa.EntityPersistentFieldStrategy;
-import org.apache.tapestry5.internal.jpa.EntityTransactionManagerImpl;
-import org.apache.tapestry5.internal.jpa.JpaTransactionAdvisorImpl;
import org.apache.tapestry5.internal.jpa.JpaValueEncoder;
-import org.apache.tapestry5.internal.jpa.PackageNamePersistenceUnitConfigurer;
import org.apache.tapestry5.internal.jpa.PersistenceContextWorker;
import org.apache.tapestry5.internal.services.PersistentFieldManager;
import org.apache.tapestry5.ioc.LoggerSource;
import org.apache.tapestry5.ioc.ScopeConstants;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Contribute;
+import org.apache.tapestry5.ioc.annotations.ImportModule;
+import org.apache.tapestry5.ioc.annotations.Local;
import org.apache.tapestry5.ioc.annotations.Primary;
import org.apache.tapestry5.ioc.annotations.Scope;
import org.apache.tapestry5.ioc.annotations.Startup;
@@ -52,15 +48,17 @@ import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.services.FactoryDefaults;
import org.apache.tapestry5.ioc.services.MasterObjectProvider;
import org.apache.tapestry5.ioc.services.PerthreadManager;
+import org.apache.tapestry5.ioc.services.ServiceOverride;
import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.JpaEntityPackageManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.JpaEntityPackageManager;
import org.apache.tapestry5.jpa.JpaPersistenceConstants;
import org.apache.tapestry5.jpa.JpaSymbols;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.modules.JpaCoreModule;
import org.apache.tapestry5.services.ApplicationStateContribution;
import org.apache.tapestry5.services.ApplicationStateManager;
import org.apache.tapestry5.services.ApplicationStatePersistenceStrategy;
@@ -76,40 +74,9 @@ import org.slf4j.Logger;
*
* @since 5.3
*/
+@ImportModule(JpaCoreModule.class)
public class JpaModule
{
- public static void bind(final ServiceBinder binder)
- {
- binder.bind(JpaTransactionAdvisor.class, JpaTransactionAdvisorImpl.class);
- binder.bind(PersistenceUnitConfigurer.class, PackageNamePersistenceUnitConfigurer.class).withSimpleId();
- binder.bind(EntityManagerSource.class, EntityManagerSourceImpl.class);
- binder.bind(EntityTransactionManager.class, EntityTransactionManagerImpl.class);
-
- }
-
- public static JpaEntityPackageManager buildJpaEntityPackageManager(final Collection<String> packageNames)
- {
- return new JpaEntityPackageManager()
- {
- @Override
- public Collection<String> getPackageNames()
- {
- return packageNames;
- }
- };
- }
-
- @Scope(ScopeConstants.PERTHREAD)
- public static EntityManagerManager buildEntityManagerManager(final EntityManagerSource entityManagerSource,
- final PerthreadManager perthreadManager, final Logger logger)
- {
- final EntityManagerManagerImpl service = new EntityManagerManagerImpl(entityManagerSource, logger);
-
- perthreadManager.addThreadCleanupListener(service);
-
- return service;
- }
-
@Contribute(JpaEntityPackageManager.class)
public static void provideEntityPackages(Configuration<String> configuration,
@@ -141,21 +108,14 @@ public class JpaModule
configuration.addInstance("JPACommitAfter", CommitAfterWorker.class, "after:Log");
}
- @Contribute(MasterObjectProvider.class)
- public static void provideObjectProviders(final OrderedConfiguration<ObjectProvider> configuration)
- {
- configuration.addInstance("EntityManager", EntityManagerObjectProvider.class,
- "before:AnnotationBasedContributions");
- }
-
@Contribute(SymbolProvider.class)
@FactoryDefaults
public static void provideFactoryDefaults(final MappedConfiguration<String, String> configuration)
{
configuration.add(JpaSymbols.PROVIDE_ENTITY_VALUE_ENCODERS, "true");
- configuration.add(JpaSymbols.EARLY_START_UP, "true");
+ configuration.override(JpaSymbols.EARLY_START_UP, "true");
configuration.add(JpaSymbols.ENTITY_SESSION_STATE_PERSISTENCE_STRATEGY_ENABLED, "true");
- configuration.add(JpaSymbols.PERSISTENCE_DESCRIPTOR, "/META-INF/persistence.xml");
+ configuration.override(JpaSymbols.PERSISTENCE_DESCRIPTOR, "/META-INF/persistence.xml");
}
@Contribute(ValueEncoderSource.class)
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/CommitCounter.java b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/CommitCounter.java
index 8d8de2848..cce16de92 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/CommitCounter.java
+++ b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/CommitCounter.java
@@ -21,7 +21,7 @@ import jakarta.persistence.EntityManager;
import jakarta.persistence.PostPersist;
import jakarta.persistence.PostUpdate;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
import org.apache.tapestry5.jpa.test.entities.VersionedThing;
public class CommitCounter
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTest.java b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTest.java
index 6c7493f0d..b87a070ea 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTest.java
+++ b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTest.java
@@ -36,7 +36,7 @@ import org.apache.tapestry5.internal.jpa.PersistedEntity;
import org.apache.tapestry5.internal.test.PageTesterContext;
import org.apache.tapestry5.ioc.Registry;
import org.apache.tapestry5.ioc.RegistryBuilder;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
import org.apache.tapestry5.jpa.modules.JpaModule;
import org.apache.tapestry5.jpa.test.entities.ThingOne;
import org.apache.tapestry5.jpa.test.entities.ThingTwo;
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTestModule.java b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTestModule.java
index 4beca5f6c..8aa355acb 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTestModule.java
+++ b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTestModule.java
@@ -17,18 +17,18 @@ import org.apache.tapestry5.commons.Configuration;
import org.apache.tapestry5.commons.MappedConfiguration;
import org.apache.tapestry5.commons.ObjectLocator;
import org.apache.tapestry5.http.internal.TapestryHttpInternalConstants;
-import org.apache.tapestry5.internal.jpa.TapestryCDIBeanManagerForJPAEntityListeners;
+import org.apache.tapestry5.internal.jpa.core.TapestryCDIBeanManagerForJPAEntityListeners;
import org.apache.tapestry5.ioc.MethodAdviceReceiver;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.Match;
import org.apache.tapestry5.ioc.services.ApplicationDefaults;
import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.JpaEntityPackageManager;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.JpaEntityPackageManager;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
import org.apache.tapestry5.jpa.test.entities.ThingOne;
import org.apache.tapestry5.jpa.test.entities.ThingTwo;
import org.apache.tapestry5.jpa.test.entities.VersionedThing;
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/NestedService.java b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/NestedService.java
index d427a86eb..284b0bd86 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/NestedService.java
+++ b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/NestedService.java
@@ -13,7 +13,7 @@
*/
package org.apache.tapestry5.jpa.test;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
public interface NestedService
{
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelService.java b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelService.java
index 849b84dae..1291ae7c3 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelService.java
+++ b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelService.java
@@ -13,7 +13,7 @@
*/
package org.apache.tapestry5.jpa.test;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
public interface TopLevelService
{
diff --git a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelServiceImpl.java b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelServiceImpl.java
index 04fa8d788..7d14d52e9 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelServiceImpl.java
+++ b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelServiceImpl.java
@@ -16,8 +16,8 @@ package org.apache.tapestry5.jpa.test;
import jakarta.persistence.EntityManager;
import org.apache.tapestry5.ioc.Invokable;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.apache.tapestry5.jpa.test.entities.ThingOne;
public class TopLevelServiceImpl implements TopLevelService
diff --git a/tapestry-jpa/src/test/java/org/example/app1/pages/CommitAfterDemo.java b/tapestry-jpa/src/test/java/org/example/app1/pages/CommitAfterDemo.java
index 9b333c564..3f08f82a3 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/CommitAfterDemo.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/CommitAfterDemo.java
@@ -18,7 +18,7 @@ import java.sql.SQLException;
import jakarta.persistence.PersistenceContext;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app1.AppConstants;
import org.example.app1.entities.User;
diff --git a/tapestry-jpa/src/test/java/org/example/app1/pages/EncodeEntities.java b/tapestry-jpa/src/test/java/org/example/app1/pages/EncodeEntities.java
index 49d190a6c..06c0d7f79 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/EncodeEntities.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/EncodeEntities.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@ import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app1.AppConstants;
import org.example.app1.entities.User;
import org.example.app1.services.UserDAO;
diff --git a/tapestry-jpa/src/test/java/org/example/app1/pages/GridDemo.java b/tapestry-jpa/src/test/java/org/example/app1/pages/GridDemo.java
index d0746be24..1bf77ea96 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/GridDemo.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/GridDemo.java
@@ -23,7 +23,7 @@ import jakarta.persistence.criteria.Root;
import org.apache.tapestry5.grid.GridDataSource;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.jpa.JpaGridDataSource;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app1.AppConstants;
import org.example.app1.entities.User;
import org.example.app1.services.UserDAO;
diff --git a/tapestry-jpa/src/test/java/org/example/app1/pages/PersistEntity.java b/tapestry-jpa/src/test/java/org/example/app1/pages/PersistEntity.java
index 6f34f29a1..1188e4ac4 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/PersistEntity.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/PersistEntity.java
@@ -22,7 +22,7 @@ import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app1.AppConstants;
import org.example.app1.entities.User;
diff --git a/tapestry-jpa/src/test/java/org/example/app1/pages/PersistThang.java b/tapestry-jpa/src/test/java/org/example/app1/pages/PersistThang.java
index 9c4d20962..1e4cabf0b 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/PersistThang.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/PersistThang.java
@@ -17,7 +17,7 @@ package org.example.app1.pages;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app1.AppConstants;
import org.example.app1.entities.Thang;
import org.example.app1.entities.User;
diff --git a/tapestry-jpa/src/test/java/org/example/app1/services/AppModule.java b/tapestry-jpa/src/test/java/org/example/app1/services/AppModule.java
index 14d7c11b6..552fb6006 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/services/AppModule.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/services/AppModule.java
@@ -21,10 +21,10 @@ import org.apache.tapestry5.ioc.annotations.ImportModule;
import org.apache.tapestry5.ioc.annotations.Match;
import org.apache.tapestry5.ioc.services.ApplicationDefaults;
import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
import org.apache.tapestry5.jpa.modules.JpaModule;
import org.example.app1.AppConstants;
import org.example.app1.entities.Thang;
diff --git a/tapestry-jpa/src/test/java/org/example/app1/services/UserDAO.java b/tapestry-jpa/src/test/java/org/example/app1/services/UserDAO.java
index 5ac815bee..970a08d80 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/services/UserDAO.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/services/UserDAO.java
@@ -18,7 +18,7 @@ import java.util.List;
import jakarta.persistence.PersistenceContext;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app1.AppConstants;
import org.example.app1.entities.User;
diff --git a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java
index f81813cb8..a5c7069cd 100644
--- a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java
+++ b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@ import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app2.entities.Item;
public class PersistItem
diff --git a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem2.java b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem2.java
index 786f9273d..ea4e2855e 100644
--- a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem2.java
+++ b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem2.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@ package org.example.app2.pages;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app2.entities.Item;
import jakarta.persistence.EntityManager;
diff --git a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem3.java b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem3.java
index f8d9820b5..ffbf5c182 100644
--- a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem3.java
+++ b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem3.java
@@ -17,7 +17,7 @@ package org.example.app2.pages;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app2.entities.Item;
import org.example.app2.services.UserDAO;
diff --git a/tapestry-jpa/src/test/java/org/example/app3/pages/PersistThing.java b/tapestry-jpa/src/test/java/org/example/app3/pages/PersistThing.java
index 172f7d97a..bb53bbe1f 100644
--- a/tapestry-jpa/src/test/java/org/example/app3/pages/PersistThing.java
+++ b/tapestry-jpa/src/test/java/org/example/app3/pages/PersistThing.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app3.model.Thing;
public class PersistThing
diff --git a/tapestry-jpa/src/test/java/org/example/app3/services/AppModule.java b/tapestry-jpa/src/test/java/org/example/app3/services/AppModule.java
index fa2cd1461..c889b666d 100644
--- a/tapestry-jpa/src/test/java/org/example/app3/services/AppModule.java
+++ b/tapestry-jpa/src/test/java/org/example/app3/services/AppModule.java
@@ -17,10 +17,10 @@ import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.ImportModule;
import org.apache.tapestry5.ioc.services.ApplicationDefaults;
import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
import org.apache.tapestry5.jpa.JpaSymbols;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
import org.apache.tapestry5.jpa.modules.JpaModule;
@ImportModule(JpaModule.class)
diff --git a/tapestry-jpa/src/test/java/org/example/app4/pages/PersistAll.java b/tapestry-jpa/src/test/java/org/example/app4/pages/PersistAll.java
index d7a808076..07b0fbf2e 100644
--- a/tapestry-jpa/src/test/java/org/example/app4/pages/PersistAll.java
+++ b/tapestry-jpa/src/test/java/org/example/app4/pages/PersistAll.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@ package org.example.app4.pages;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app1.entities.Thang;
import org.example.app1.entities.User;
import org.example.app2.entities.Item;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/pages/CommitAfterDemo.java b/tapestry-jpa/src/test/java/org/example/app6/pages/CommitAfterDemo.java
index c6445f44b..b59bed456 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/CommitAfterDemo.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/CommitAfterDemo.java
@@ -18,7 +18,7 @@ import java.sql.SQLException;
import jakarta.persistence.PersistenceContext;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app6.AppConstants;
import org.example.app6.entities.User;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/pages/EncodeEntities.java b/tapestry-jpa/src/test/java/org/example/app6/pages/EncodeEntities.java
index 8d172ab10..10541ecb9 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/EncodeEntities.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/EncodeEntities.java
@@ -21,7 +21,7 @@ import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app6.AppConstants;
import org.example.app6.entities.User;
import org.example.app6.services.UserDAO;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/pages/GridDemo.java b/tapestry-jpa/src/test/java/org/example/app6/pages/GridDemo.java
index 88b2e6fd7..9d13a4e33 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/GridDemo.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/GridDemo.java
@@ -23,7 +23,7 @@ import jakarta.persistence.criteria.Root;
import org.apache.tapestry5.grid.GridDataSource;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.jpa.JpaGridDataSource;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app6.AppConstants;
import org.example.app6.entities.User;
import org.example.app6.services.UserDAO;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/pages/PersistEntity.java b/tapestry-jpa/src/test/java/org/example/app6/pages/PersistEntity.java
index 26a922506..da7068de6 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/PersistEntity.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/PersistEntity.java
@@ -22,7 +22,7 @@ import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app6.AppConstants;
import org.example.app6.entities.User;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/pages/PersistThang.java b/tapestry-jpa/src/test/java/org/example/app6/pages/PersistThang.java
index b542f2419..866d7be1b 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/PersistThang.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/PersistThang.java
@@ -24,7 +24,7 @@ import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app6.entities.Thang;
public class PersistThang
diff --git a/tapestry-jpa/src/test/java/org/example/app6/services/AppModule.java b/tapestry-jpa/src/test/java/org/example/app6/services/AppModule.java
index 9304acc5c..2895f3b96 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/services/AppModule.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/services/AppModule.java
@@ -21,10 +21,10 @@ import org.apache.tapestry5.ioc.annotations.ImportModule;
import org.apache.tapestry5.ioc.annotations.Match;
import org.apache.tapestry5.ioc.services.ApplicationDefaults;
import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
import org.apache.tapestry5.jpa.modules.JpaModule;
import org.example.app6.AppConstants;
import org.example.app6.entities.Thang;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/services/UserDAO.java b/tapestry-jpa/src/test/java/org/example/app6/services/UserDAO.java
index 0e6fb274c..30eb91af4 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/services/UserDAO.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/services/UserDAO.java
@@ -18,7 +18,7 @@ import java.util.List;
import jakarta.persistence.PersistenceContext;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app6.AppConstants;
import org.example.app6.entities.User;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/services/impl/UserDAOImpl.java b/tapestry-jpa/src/test/java/org/example/app6/services/impl/UserDAOImpl.java
index a29985f30..29fc711e3 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/services/impl/UserDAOImpl.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/services/impl/UserDAOImpl.java
@@ -20,7 +20,7 @@ import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
import org.example.app6.AppConstants;
import org.example.app6.entities.User;
import org.example.app6.services.UserDAO;