55 */
66package io .jooby .hibernate ;
77
8- import java .net .URL ;
9- import java .util .Arrays ;
108import java .util .Collections ;
119import java .util .HashMap ;
1210import java .util .List ;
13- import java .util .Map ;
1411import java .util .Objects ;
1512import java .util .Optional ;
1613import java .util .stream .Collectors ;
1714import java .util .stream .Stream ;
1815
1916import javax .sql .DataSource ;
2017
21- import org .hibernate .Session ;
22- import org .hibernate .SessionBuilder ;
23- import org .hibernate .SessionFactory ;
24- import org .hibernate .boot .Metadata ;
25- import org .hibernate .boot .MetadataBuilder ;
18+ import org .hibernate .*;
2619import org .hibernate .boot .MetadataSources ;
27- import org .hibernate .boot .SessionFactoryBuilder ;
28- import org .hibernate .boot .registry .BootstrapServiceRegistry ;
2920import org .hibernate .boot .registry .BootstrapServiceRegistryBuilder ;
3021import org .hibernate .boot .registry .StandardServiceRegistry ;
3122import org .hibernate .boot .registry .StandardServiceRegistryBuilder ;
3223import org .hibernate .cfg .AvailableSettings ;
3324
34- import com .typesafe .config .Config ;
3525import edu .umd .cs .findbugs .annotations .NonNull ;
3626import io .jooby .Environment ;
3727import io .jooby .Extension ;
4030import io .jooby .ServiceRegistry ;
4131import io .jooby .internal .hibernate .ScanEnvImpl ;
4232import io .jooby .internal .hibernate .SessionServiceProvider ;
33+ import io .jooby .internal .hibernate .StatelessSessionServiceProvider ;
4334import io .jooby .internal .hibernate .UnitOfWorkProvider ;
4435import jakarta .inject .Provider ;
4536import jakarta .persistence .EntityManager ;
@@ -145,19 +136,21 @@ public class HibernateModule implements Extension {
145136
146137 private final String name ;
147138 private List <String > packages = Collections .emptyList ();
148- private List <Class > classes ;
139+ private final List <Class <?> > classes ;
149140 private HibernateConfigurer configurer = new HibernateConfigurer ();
150141 private SessionProvider sessionBuilder = SessionBuilder ::openSession ;
142+ private StatelessSessionProvider statelessSessionProvider =
143+ StatelessSessionBuilder ::openStatelessSession ;
151144
152145 /**
153146 * Creates a Hibernate module.
154147 *
155148 * @param name The name/key of the data source to attach.
156149 * @param classes Persistent classes.
157150 */
158- public HibernateModule (@ NonNull String name , Class ... classes ) {
151+ public HibernateModule (@ NonNull String name , Class <?> ... classes ) {
159152 this .name = name ;
160- this .classes = Arrays . asList (classes );
153+ this .classes = List . of (classes );
161154 }
162155
163156 /**
@@ -176,7 +169,7 @@ public HibernateModule(Class... classes) {
176169 * @param name The name/key of the data source to attach.
177170 * @param classes Persistent classes.
178171 */
179- public HibernateModule (@ NonNull String name , List <Class > classes ) {
172+ public HibernateModule (@ NonNull String name , List <Class <?> > classes ) {
180173 this .name = name ;
181174 this .classes = classes ;
182175 }
@@ -188,7 +181,7 @@ public HibernateModule(@NonNull String name, List<Class> classes) {
188181 * @return This module.
189182 */
190183 public @ NonNull HibernateModule scan (@ NonNull String ... packages ) {
191- this .packages = Arrays . asList (packages );
184+ this .packages = List . of (packages );
192185 return this ;
193186 }
194187
@@ -227,36 +220,36 @@ public HibernateModule(@NonNull String name, List<Class> classes) {
227220
228221 @ Override
229222 public void install (@ NonNull Jooby application ) {
230- Environment env = application .getEnvironment ();
231- Config config = application .getConfig ();
232- ServiceRegistry registry = application .getServices ();
233- DataSource dataSource = registry .getOrNull (ServiceKey .key (DataSource .class , name ));
223+ var env = application .getEnvironment ();
224+ var config = application .getConfig ();
225+ var registry = application .getServices ();
226+ var dataSource = registry .getOrNull (ServiceKey .key (DataSource .class , name ));
234227 boolean fallback = false ;
235228 if (dataSource == null ) {
236229 // TODO: replace with usage exception
237230 dataSource = registry .require (DataSource .class );
238231 fallback = true ;
239232 }
240- BootstrapServiceRegistryBuilder bsrb = new BootstrapServiceRegistryBuilder ();
233+ var bsrb = new BootstrapServiceRegistryBuilder ();
241234 boolean defaultDdlAuto = env .isActive ("dev" , "test" );
242235
243- boolean flyway = isFlywayPresent (env , registry , name , fallback );
244- String ddlAuto = flyway ? "none" : (defaultDdlAuto ? "update" : "none" );
236+ var flyway = isFlywayPresent (env , registry , name , fallback );
237+ var ddlAuto = flyway ? "none" : (defaultDdlAuto ? "update" : "none" );
245238
246239 configurer .configure (bsrb , config );
247240
248- BootstrapServiceRegistry bsr = bsrb .build ();
249- StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder (bsr );
241+ var bsr = bsrb .build ();
242+ var ssrb = new StandardServiceRegistryBuilder (bsr );
250243
251244 ssrb .applySetting (AvailableSettings .HBM2DDL_AUTO , ddlAuto );
252245 ssrb .applySetting (AvailableSettings .CURRENT_SESSION_CONTEXT_CLASS , "managed" );
253246 // apply application.conf
254247 var base = env .getProperties ("hibernate" );
255248 var custom = env .getProperties (name + ".hibernate" , "hibernate" );
256- Map < String , String > javax = env .getProperties ("hibernate.javax" , "javax" );
257- Map < String , String > jakarta = env .getProperties ("hibernate.jakarta" , "jakarta" );
249+ var javax = env .getProperties ("hibernate.javax" , "javax" );
250+ var jakarta = env .getProperties ("hibernate.jakarta" , "jakarta" );
258251
259- Map < String , Object > settings = new HashMap <>();
252+ var settings = new HashMap <String , Object >();
260253 settings .putAll (base );
261254 settings .putAll (custom );
262255 settings .putAll (javax );
@@ -282,50 +275,59 @@ public void install(@NonNull Jooby application) {
282275
283276 configurer .configure (sources , config );
284277
285- /** Scan package? */
286- ClassLoader classLoader = env .getClassLoader ();
287- List < URL > packages =
278+ /* Scan package? */
279+ var classLoader = env .getClassLoader ();
280+ var packages =
288281 sources .getAnnotatedPackages ().stream ()
289282 .map (pkg -> classLoader .getResource (pkg .replace ('.' , '/' )))
290- .collect ( Collectors . toList () );
283+ .toList ();
291284
292- MetadataBuilder metadataBuilder = sources .getMetadataBuilder ();
285+ var metadataBuilder = sources .getMetadataBuilder ();
293286 if (!packages .isEmpty ()) {
294287 metadataBuilder .applyScanEnvironment (new ScanEnvImpl (packages ));
295288 }
296289
297290 configurer .configure (metadataBuilder , config );
298291
299- Metadata metadata = metadataBuilder .build ();
292+ var metadata = metadataBuilder .build ();
300293
301- SessionFactoryBuilder sfb = metadata .getSessionFactoryBuilder ();
294+ var sfb = metadata .getSessionFactoryBuilder ();
302295 sfb .applyName (name );
303296 sfb .applyNameAsJndiName (false );
304297
305298 configurer .configure (sfb , config );
306299
307- SessionFactory sf = sfb .build ();
300+ var sf = sfb .build ();
308301
309- /** Session and EntityManager. */
302+ /* Session and EntityManager. */
310303 Provider sessionServiceProvider = new SessionServiceProvider (sf , sessionBuilder );
311304 registry .putIfAbsent (Session .class , sessionServiceProvider );
312305 registry .put (ServiceKey .key (Session .class , name ), sessionServiceProvider );
313306
314307 registry .putIfAbsent (EntityManager .class , sessionServiceProvider );
315308 registry .put (ServiceKey .key (EntityManager .class , name ), sessionServiceProvider );
316309
317- /** SessionFactory and EntityManagerFactory. */
310+ /* StatelessSession. */
311+ registry .putIfAbsent (
312+ StatelessSession .class , new StatelessSessionServiceProvider (sf , statelessSessionProvider ));
313+
314+ /* SessionFactory and EntityManagerFactory. */
318315 registry .putIfAbsent (SessionFactory .class , sf );
319316 registry .put (ServiceKey .key (SessionFactory .class , name ), sf );
320317
321318 registry .putIfAbsent (EntityManagerFactory .class , sf );
322319 registry .put (ServiceKey .key (EntityManagerFactory .class , name ), sf );
323320
324- /** Session Provider: */
321+ /* Session Provider: */
325322 registry .putIfAbsent (SessionProvider .class , sessionBuilder );
326323 registry .put (ServiceKey .key (SessionProvider .class , name ), sessionBuilder );
327324
328- /** UnitOfWork Provider: */
325+ /* StatelessSession Provider: */
326+ registry .putIfAbsent (StatelessSessionProvider .class , this .statelessSessionProvider );
327+ registry .put (
328+ ServiceKey .key (StatelessSessionProvider .class , name ), this .statelessSessionProvider );
329+
330+ /* UnitOfWork Provider: */
329331 UnitOfWorkProvider unitOfWorkProvider = new UnitOfWorkProvider (sf , sessionBuilder );
330332 registry .putIfAbsent (UnitOfWork .class , unitOfWorkProvider );
331333 registry .put (ServiceKey .key (UnitOfWork .class , name ), unitOfWorkProvider );
0 commit comments