jungm opened a new pull request, #2847: URL: https://github.com/apache/tomee/pull/2847
Fixes [TOMEE-4650](https://issues.apache.org/jira/browse/TOMEE-4650). Two independent problems, both reproducing on Plume (EclipseLink) and the webprofile distribution (OpenJPA) — so neither is a persistence-provider defect. ## 1. Undeploy closes an already-closed EntityManagerFactory When a test (or application) closes a container-managed `EntityManagerFactory` itself, TomEE's undeploy path called `close()` on it again, and `Assembler.destroyApplication` then failed with *"Attempting to execute an operation on a closed EntityManagerFactory"*. The test method passed; only the undeploy step errored. `ReloadableEntityManagerFactory.close()` now checks `isOpen()` before delegating to the underlying EMF. ## 2. Missing Jakarta Persistence 3.2 CDI qualifier beans TomEE did not register the CDI beans that the Jakarta EE 11 / Persistence 3.2 CDI integration requires for `persistence.xml`-declared units. Injecting a qualified `EntityManagerFactory`, `EntityManager`, or `PersistenceUnitUtil` (e.g. `@Inject @CtsEm2Qualifier`) failed at deploy time with `UnsatisfiedResolutionException`. A new `JpaCDIExtension` registers, for each persistence unit: - `EntityManagerFactory` — `@ApplicationScoped`, bean name = persistence-unit name - `EntityManager` — in the scope given by `<scope>`, defaulting to `jakarta.transaction.TransactionScoped` - `CriteriaBuilder`, `PersistenceUnitUtil`, `Cache`, `SchemaManager`, `Metamodel` — `@Dependent`, each obtained from the matching getter of the EMF All of them carry the qualifiers declared by the `<qualifier>` elements, or `@Default` when none is declared. The bean-registration contract (scopes, qualifiers, bean name) was checked against the Jakarta EE 11 Platform spec (`CDI-JPA`) and the Persistence 3.2 schema rather than from memory. Supporting plumbing: - `<qualifier>`/`<scope>` added to the `persistence.xml` JAXB model (`PersistenceUnit`) in the XSD-mandated position. This model is hand-maintained, not generated (the xjc profile does not cover persistence schemas), and TomEE does not validate `persistence.xml` against a bundled XSD, so no schema files needed updating. - Fields carried through `PersistenceUnitInfo` and `AppInfoBuilder`, which also honours the `jakarta.persistence.qualifiers` / `jakarta.persistence.scope` override properties per the spec. - Extension registered in `OptimizedLoaderService`, alongside the analogous `ConcurrencyCDIExtension` it is modeled on. ## Tests - `ReloadableEntityManagerFactoryCloseTest` — verifies a second `close()` is a no-op. Confirmed it fails against the unpatched code (2 close calls instead of 1). - `JpaCDIExtensionTest` — verifies qualified and `@Default` EMF/`PersistenceUnitUtil` injection across two persistence units. Confirmed it fails against the unpatched code with the exact `UnsatisfiedResolutionException` from the issue. ## Notes for reviewers - The excluded TCK tests named in the issue (`entityManagerFactoryCloseExceptions/ClientP{m,u}servletTest`, `ee.cdi.ServletEMLookupTest`) live in the separate `apache/tomee-tck` harness repo; their exclusion lines still need removing there once this merges. That change is not in this PR. - `SchemaManager`/`Metamodel`/`CriteriaBuilder`/`Cache` beans are registered per spec but only `EntityManagerFactory` and `PersistenceUnitUtil` are exercised in the unit tests — the others eagerly trigger OpenJPA entity enhancement, which the unenhanced test setup in this module cannot satisfy. The full validation is a TCK run. 🤖 Generated with [Claude Code](https://claude.com/claude-code) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
