11package io .quarkus .hibernate .orm .deployment ;
22
3+ import static org .apache .commons .lang3 .BooleanUtils .isFalse ;
4+
35import java .util .ArrayList ;
46import java .util .Arrays ;
57import java .util .List ;
68import java .util .Locale ;
79import java .util .Set ;
10+ import java .util .function .Function ;
811import java .util .stream .Collectors ;
912
1013import jakarta .enterprise .context .ApplicationScoped ;
1821import org .hibernate .Session ;
1922import org .hibernate .SessionFactory ;
2023import org .hibernate .StatelessSession ;
24+ import org .hibernate .query .criteria .HibernateCriteriaBuilder ;
25+ import org .hibernate .relational .SchemaManager ;
2126import org .jboss .jandex .AnnotationInstance ;
2227import org .jboss .jandex .AnnotationTarget .Kind ;
28+ import org .jboss .jandex .AnnotationTransformation ;
2329import org .jboss .jandex .AnnotationValue ;
2430import org .jboss .jandex .ClassType ;
2531import org .jboss .jandex .DotName ;
@@ -64,6 +70,13 @@ public class HibernateOrmCdiProcessor {
6470 ClassNames .SESSION_FACTORY );
6571 private static final List <DotName > SESSION_EXPOSED_TYPES = Arrays .asList (ClassNames .ENTITY_MANAGER , ClassNames .SESSION );
6672 private static final List <DotName > STATELESS_SESSION_EXPOSED_TYPES = List .of (ClassNames .STATELESS_SESSION );
73+ private static final List <DotName > CRITERIA_BUILDER_EXPOSED_TYPES = List .of (ClassNames .CRITERIA_BUILDER ,
74+ ClassNames .HIBERNATE_CRITERIA_BUILDER );
75+ private static final List <DotName > METAMODEL_EXPOSED_TYPES = List .of (ClassNames .METAMODEL , ClassNames .JPA_METAMODEL ,
76+ ClassNames .HIBERNATE_METAMODEL );
77+ private static final List <DotName > SCHEMA_MANAGER_EXPOSED_TYPES = List .of (ClassNames .SCHEMA_MANAGER );
78+ private static final List <DotName > CACHE_EXPOSED_TYPES = List .of (ClassNames .CACHE , ClassNames .HIBERNATE_CACHE );
79+ private static final List <DotName > PERSISTENCE_UNIT_UTIL_EXPOSED_TYPES = List .of (ClassNames .PERSISTENCE_UNIT_UTIL );
6780
6881 private static final Set <DotName > PERSISTENCE_UNIT_EXTENSION_VALID_TYPES = Set .of (
6982 ClassNames .TENANT_RESOLVER ,
@@ -76,7 +89,7 @@ public class HibernateOrmCdiProcessor {
7689 AnnotationsTransformerBuildItem convertJpaResourceAnnotationsToQualifier (
7790 List <PersistenceUnitDescriptorBuildItem > persistenceUnitDescriptors ,
7891 ImpliedBlockingPersistenceUnitTypeBuildItem impliedBlockingPersistenceUnitType ) {
79- AnnotationsTransformer transformer = new AnnotationsTransformer () {
92+ AnnotationTransformation transformer = new AnnotationsTransformer () {
8093
8194 @ Override
8295 public boolean appliesTo (Kind kind ) {
@@ -178,34 +191,22 @@ void generateDataSourceBeans(HibernateOrmRecorder recorder,
178191 return ;
179192 }
180193
194+ Function <String , AnnotationInstance > createPersistenceUnitQualifier = (puName ) -> AnnotationInstance
195+ .builder (PersistenceUnit .class ).add ("value" , puName ).build ();
196+ AnnotationInstance defaultQualifierInstance = AnnotationInstance .builder (Default .class ).build ();
197+
181198 // we have only one persistence unit defined in a persistence.xml: we make it the default even if it has a name
182199 // NOTE: In this case we know we're not using Hibernate Reactive, because it doesn't support persistence.xml.
183200 if (persistenceUnitDescriptors .size () == 1 && persistenceUnitDescriptors .get (0 ).isFromPersistenceXml ()) {
184201 String persistenceUnitName = persistenceUnitDescriptors .get (0 ).getPersistenceUnitName ();
185202
186- syntheticBeanBuildItemBuildProducer
187- .produce (createSyntheticBean (persistenceUnitName ,
188- true , true ,
189- SessionFactory .class , SESSION_FACTORY_EXPOSED_TYPES , true )
190- .createWith (recorder .sessionFactorySupplier (persistenceUnitName ))
191- .addInjectionPoint (ClassType .create (DotName .createSimple (JPAConfig .class )))
192- .done ());
193-
194- syntheticBeanBuildItemBuildProducer
195- .produce (createSyntheticBean (persistenceUnitName ,
196- true , true ,
197- Session .class , SESSION_EXPOSED_TYPES , false )
198- .createWith (recorder .sessionSupplier (persistenceUnitName ))
199- .addInjectionPoint (ClassType .create (DotName .createSimple (TransactionSessions .class )))
200- .done ());
201-
202- syntheticBeanBuildItemBuildProducer
203- .produce (createSyntheticBean (persistenceUnitName ,
204- true , true ,
205- StatelessSession .class , STATELESS_SESSION_EXPOSED_TYPES , false )
206- .createWith (recorder .statelessSessionSupplier (persistenceUnitName ))
207- .addInjectionPoint (ClassType .create (DotName .createSimple (TransactionSessions .class )))
208- .done ());
203+ produceSessionFactoryBean (syntheticBeanBuildItemBuildProducer , recorder , persistenceUnitName , true , true );
204+
205+ produceSessionBeans (syntheticBeanBuildItemBuildProducer , recorder , persistenceUnitName , true , true );
206+
207+ produceFactoryDependentBeans (syntheticBeanBuildItemBuildProducer , recorder , persistenceUnitName ,
208+ true , true , defaultQualifierInstance );
209+
209210 return ;
210211 }
211212
@@ -223,34 +224,22 @@ void generateDataSourceBeans(HibernateOrmRecorder recorder,
223224 // We will need to fix this at some point, see https://github.com/quarkusio/quarkus/issues/21110
224225 String persistenceUnitConfigName = persistenceUnitDescriptor .getConfigurationName ();
225226 boolean isDefaultPU = PersistenceUnitUtil .isDefaultPersistenceUnit (persistenceUnitConfigName );
226- boolean isNamedPU = !isDefaultPU ;
227-
228- syntheticBeanBuildItemBuildProducer
229- .produce (createSyntheticBean (persistenceUnitName ,
230- isDefaultPU ,
231- isNamedPU ,
232- SessionFactory .class ,
233- SESSION_FACTORY_EXPOSED_TYPES ,
234- true )
235- .createWith (recorder .sessionFactorySupplier (persistenceUnitName ))
236- .addInjectionPoint (ClassType .create (DotName .createSimple (JPAConfig .class )))
237- .done ());
238-
239- syntheticBeanBuildItemBuildProducer
240- .produce (createSyntheticBean (persistenceUnitName ,
241- isDefaultPU , isNamedPU ,
242- Session .class , SESSION_EXPOSED_TYPES , false )
243- .createWith (recorder .sessionSupplier (persistenceUnitName ))
244- .addInjectionPoint (ClassType .create (DotName .createSimple (TransactionSessions .class )))
245- .done ());
246-
247- syntheticBeanBuildItemBuildProducer
248- .produce (createSyntheticBean (persistenceUnitName ,
249- isDefaultPU , isNamedPU ,
250- StatelessSession .class , STATELESS_SESSION_EXPOSED_TYPES , false )
251- .createWith (recorder .statelessSessionSupplier (persistenceUnitName ))
252- .addInjectionPoint (ClassType .create (DotName .createSimple (TransactionSessions .class )))
253- .done ());
227+ boolean isNamedPU = isFalse (isDefaultPU );
228+ AnnotationInstance sessionFactoryQualifier ;
229+ if (isDefaultPU ) {
230+ sessionFactoryQualifier = defaultQualifierInstance ;
231+ } else {
232+ sessionFactoryQualifier = createPersistenceUnitQualifier .apply (persistenceUnitName );
233+ }
234+
235+ produceSessionFactoryBean (syntheticBeanBuildItemBuildProducer , recorder , persistenceUnitName , isDefaultPU ,
236+ isNamedPU );
237+
238+ produceSessionBeans (syntheticBeanBuildItemBuildProducer , recorder , persistenceUnitName , isDefaultPU , isNamedPU );
239+
240+ produceFactoryDependentBeans (syntheticBeanBuildItemBuildProducer , recorder , persistenceUnitName ,
241+ isDefaultPU , isNamedPU , sessionFactoryQualifier );
242+
254243 }
255244 }
256245
@@ -352,4 +341,98 @@ private static <T> ExtendedBeanConfigurator createSyntheticBean(String persisten
352341
353342 return configurator ;
354343 }
344+
345+ private void produceSessionBeans (
346+ BuildProducer <SyntheticBeanBuildItem > producer ,
347+ HibernateOrmRecorder recorder ,
348+ String persistenceUnitName ,
349+ boolean isDefaultPU ,
350+ boolean isNamedPU ) {
351+
352+ // Create Session bean
353+ producer .produce (createSyntheticBean (persistenceUnitName ,
354+ isDefaultPU , isNamedPU ,
355+ Session .class , SESSION_EXPOSED_TYPES , false )
356+ .createWith (recorder .sessionSupplier (persistenceUnitName ))
357+ .addInjectionPoint (ClassType .create (DotName .createSimple (TransactionSessions .class )))
358+ .done ());
359+
360+ // Create StatelessSession bean
361+ producer .produce (createSyntheticBean (persistenceUnitName ,
362+ isDefaultPU , isNamedPU ,
363+ StatelessSession .class , STATELESS_SESSION_EXPOSED_TYPES , false )
364+ .createWith (recorder .statelessSessionSupplier (persistenceUnitName ))
365+ .addInjectionPoint (ClassType .create (DotName .createSimple (TransactionSessions .class )))
366+ .done ());
367+ }
368+
369+ private void produceSessionFactoryBean (
370+ BuildProducer <SyntheticBeanBuildItem > producer ,
371+ HibernateOrmRecorder recorder ,
372+ String persistenceUnitName ,
373+ boolean isDefaultPU ,
374+ boolean isNamedPU ) {
375+
376+ producer .produce (createSyntheticBean (persistenceUnitName ,
377+ isDefaultPU , isNamedPU ,
378+ SessionFactory .class , SESSION_FACTORY_EXPOSED_TYPES , true )
379+ .createWith (recorder .sessionFactorySupplier (persistenceUnitName ))
380+ .addInjectionPoint (ClassType .create (DotName .createSimple (JPAConfig .class )))
381+ .done ());
382+ }
383+
384+ private void produceFactoryDependentBeans (
385+ BuildProducer <SyntheticBeanBuildItem > producer ,
386+ HibernateOrmRecorder recorder ,
387+ String persistenceUnitName ,
388+ boolean isDefaultPU ,
389+ boolean isNamedPU ,
390+ AnnotationInstance sessionFactoryQualifier ) {
391+
392+ // Create CriteriaBuilder bean
393+ producer .produce (createSyntheticBean (persistenceUnitName ,
394+ isDefaultPU , isNamedPU ,
395+ HibernateCriteriaBuilder .class , CRITERIA_BUILDER_EXPOSED_TYPES , false )
396+ .createWith (recorder .criteriaBuilderSupplier (persistenceUnitName ))
397+ .addInjectionPoint (ClassType .create (DotName .createSimple (SessionFactory .class )),
398+ sessionFactoryQualifier )
399+ .done ());
400+
401+ // Create Metamodel bean
402+ producer .produce (createSyntheticBean (persistenceUnitName ,
403+ isDefaultPU , isNamedPU ,
404+ org .hibernate .Metamodel .class , METAMODEL_EXPOSED_TYPES , false )
405+ .createWith (recorder .metamodelSupplier (persistenceUnitName ))
406+ .addInjectionPoint (ClassType .create (DotName .createSimple (SessionFactory .class )),
407+ sessionFactoryQualifier )
408+ .done ());
409+
410+ // Create SchemaManager bean
411+ producer .produce (createSyntheticBean (persistenceUnitName ,
412+ isDefaultPU , isNamedPU ,
413+ SchemaManager .class , SCHEMA_MANAGER_EXPOSED_TYPES , false )
414+ .createWith (recorder .schemaManagerSupplier (persistenceUnitName ))
415+ .addInjectionPoint (ClassType .create (DotName .createSimple (SessionFactory .class )),
416+ sessionFactoryQualifier )
417+ .done ());
418+
419+ // Create Cache bean
420+ producer .produce (createSyntheticBean (persistenceUnitName ,
421+ isDefaultPU , isNamedPU ,
422+ org .hibernate .Cache .class , CACHE_EXPOSED_TYPES , false )
423+ .createWith (recorder .cacheSupplier (persistenceUnitName ))
424+ .addInjectionPoint (ClassType .create (DotName .createSimple (SessionFactory .class )),
425+ sessionFactoryQualifier )
426+ .done ());
427+
428+ // Create PersistenceUnitUtil bean
429+ producer .produce (createSyntheticBean (persistenceUnitName ,
430+ isDefaultPU , isNamedPU ,
431+ jakarta .persistence .PersistenceUnitUtil .class , PERSISTENCE_UNIT_UTIL_EXPOSED_TYPES , false )
432+ .createWith (recorder .persistenceUnitUtilSupplier (persistenceUnitName ))
433+ .addInjectionPoint (ClassType .create (DotName .createSimple (SessionFactory .class )),
434+ sessionFactoryQualifier )
435+ .done ());
436+ }
437+
355438}
0 commit comments