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]

Reply via email to