From 2036280fa0e05c2cc3a3069a83475dfcda9a5b68 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Thu, 30 Jul 2015 16:41:53 -0500 Subject: [PATCH] HHH-9981 - Document the "transaction system"; HHH-10007 - Audit Services chapter in Integrations Guide --- .../en-US/chapters/services/Services.xml | 1534 +++++------------ .../en-US/images/hibernate_logo_a.png | Bin 0 -> 31862 bytes .../chapters/transactions/Transactions.xml | 7 + 3 files changed, 479 insertions(+), 1062 deletions(-) create mode 100644 documentation/src/main/docbook/integration/en-US/images/hibernate_logo_a.png diff --git a/documentation/src/main/docbook/integration/en-US/chapters/services/Services.xml b/documentation/src/main/docbook/integration/en-US/chapters/services/Services.xml index 3701eb21b6..384e40640a 100644 --- a/documentation/src/main/docbook/integration/en-US/chapters/services/Services.xml +++ b/documentation/src/main/docbook/integration/en-US/chapters/services/Services.xml @@ -9,1105 +9,515 @@ - Services + Services and Registries + + + Services and registries are new *as a formalized concept* starting in 4.0. But the functionality provided by + the different Services have actually been around in Hibernate much, much longer. What is new is managing them, + their lifecycles and dependencies through a lightweight, dedicated container we call a ServiceRegistry. The + goal of this guide is to describe the design and purpose of these Services and Registries, as well as to look at + details of their implementations where appropriate. It will also delve into the ways third-party integrators and + applications can leverage and customize Services and Registries. +
- What are services? - - Services are classes that provide Hibernate with pluggable implementations of various types of - functionality. Specifically they are implementations of certain service contract interfaces. The interface - is known as the service role; the implementation class is know as the service implementation. Generally - speaking, users can plug in alternate implementations of all standard service roles (overriding); they can - also define additional services beyond the base set of service roles (extending). - -
+ What is a Service? -
- Service contracts - The basic requirement for a service is to implement the marker interface - org.hibernate.service.Service. Hibernate uses this internally for some - basic type safety. + A services provides a certain types of functionality, in a pluggable manner. Specifically they are + interfaces defining certain functionality and then implementations of those service contract interfaces. + The interface is known as the service role; the implementation class is known as the service implementation. + The pluggability comes from the fact that the service implementation adheres to contract defined by the + interface of the service role and that consumers of the service program to the service role, not the + implementation. - - Optionally, the service can also implement the - org.hibernate.service.spi.Startable and - org.hibernate.service.spi.Stoppable interfaces to receive notifications - of being started and stopped. Another optional service contract is - org.hibernate.service.spi.Manageable which marks the service as manageable - in JMX provided the JMX integration is enabled. - -
-
- Service dependencies - Services are allowed to declare dependencies on other services using either of 2 approaches. + Generally speaking, users can plug in alternate implementations of all standard service roles (overriding); + they can also define additional services beyond the base set of service roles (extending). + + + Let's look at an example to better define what a Service is. Hibernate needs to be able to access + JDBC Connections to the database. The way it obtains and releases these Connections is through the + ConnectionProvider service. The service is defined by the interface (service role) + org.hibernate.engine.jdbc.connections.spi.ConnectionProvider which declares + methods for obtaining and releasing the Connections. There are then multiple implementations of that + service contract, varying in how they actually manage the Connections. + + + + Internally Hibernate always references org.hibernate.engine.jdbc.connections.spi.ConnectionProvider + rather than specific implementations in consuming the service (we will get to producing the service later + when we talk about registries). Because of that fact, other ConnectionProvider service implementations + could easily be plugged in. + + + + There is nothing revolutionary here; programming to interfaces is generally accepted as good programming + practice. What's interesting is the ServiceRegistry and the pluggable swapping of the different implementors. + +
- @<interfacename>org.hibernate.service.spi.InjectService</interfacename> + Service contracts + - Any method on the service implementation class accepting a single parameter and annotated with - @InjectService is considered requesting injection of another service. + The basic requirement for a service is to implement the marker interface + org.hibernate.service.Service. Hibernate uses this internally for some + basic type safety. + - By default the type of the method parameter is expected to be the service role to be injected. If the - parameter type is different than the service role, the serviceRole attribute - of the InjectService should be used to explicitly name the role. - - - By default injected services are considered required, that is the start up will fail if a named - dependent service is missing. If the service to be injected is optional, the - required attribute of the InjectService - should be declared as false (default is true). + The service can also implement a number of optional life-cycle related contracts: + + + + org.hibernate.service.spi.Startable - allows the service + impl to be notified that it is being started and about to be put into use. + + + + + org.hibernate.service.spi.Stoppable - allows the service + impl to be notified that it is being stopped and will be removed from use. + + + + + org.hibernate.service.spi.ServiceRegistryAwareService - allows + the service to be injected with a reference to the registry that is managing it. See + . + + + + + org.hibernate.service.spi.Manageable - marks the service + as manageable in JMX provided the JMX integration is enabled. This feature is still incomplete. + + + + + The different registry implementations also understand additional optional contracts specific + to that registry. For details, see the details for each registry under + + + +
-
- <interfacename>org.hibernate.service.spi.ServiceRegistryAwareService</interfacename> + +
+ Service dependencies - The second approach is a pull approach where the service implements the optional service interface - org.hibernate.service.spi.ServiceRegistryAwareService which declares - a single injectServices method. During startup, Hibernate will inject the - org.hibernate.service.ServiceRegistry itself into services which - implement this interface. The service can then use the ServiceRegistry - reference to locate any additional services it needs. + Services are allowed to declare dependencies on other services using either of 2 approaches. +
+ @<interfacename>org.hibernate.service.spi.InjectService</interfacename> + + Any method on the service implementation class accepting a single parameter and annotated with + @InjectService is considered requesting injection of another service. + + + By default the type of the method parameter is expected to be the service role to be injected. If the + parameter type is different than the service role, the serviceRole attribute + of the InjectService annotation should be used to explicitly name the role. + + + By default injected services are considered required, that is the start up will fail if a named + dependent service is missing. If the service to be injected is optional, the + required attribute of the InjectService + annotation should be declared as false (default is true). + +
+
+ <interfacename>org.hibernate.service.spi.ServiceRegistryAwareService</interfacename> + + The second approach is a pull approach where the service implements the optional service interface + org.hibernate.service.spi.ServiceRegistryAwareService which declares + a single injectServices method. During startup, Hibernate will inject the + org.hibernate.service.ServiceRegistry itself into services which + implement this interface. The service can then use the ServiceRegistry + reference to locate any additional services it needs. + +
+
- ServiceRegistry + What is a ServiceRegistry? + - The central service API, aside from the services themselves, is the - org.hibernate.service.ServiceRegistry interface. The main purpose of - a service registry is to hold, manage and provide access to services. + A ServiceRegistry, at its most basic, hosts and manages Services. Its contract is defined by the + org.hibernate.service.ServiceRegistry interface. + - Service registries are hierarchical. Services in one registry can depend on and utilize services in that - same registry as well as any parent registries. + We already gave a basic overview and definition of services. But services have other interesting + characteristics as well. Services have a lifecycle. They have a scope. Services might depend on other + services. And they need to be produced (choose using one implementation over another). The ServiceRegistry + fulfills all these needs. + - Use org.hibernate.boot.registry.StandardServiceRegistryBuilder to build a - org.hibernate.service.ServiceRegistry instance. + In a concise definition, the ServiceRegistry acts as a inversion-of-control (IoC) container. -
- -
- Standard services - -
- <interfacename>org.hibernate.engine.jdbc.batch.spi.BatchBuilder</interfacename> - - - Notes - - - Defines strategy for how Hibernate manages JDBC statement batching - - - - - Initiator - - - org.hibernate.engine.jdbc.batch.internal.BatchBuilderInitiator - - - - - Implementations - - - org.hibernate.engine.jdbc.batch.internal.BatchBuilderImpl - - - - -
- -
- <interfacename>org.hibernate.engine.config.spi.ConfigurationService</interfacename> - - - Notes - - - Provides access to the configuration settings, combining those explicitly provided as well - as those contributed by any registered - org.hibernate.integrator.spi.Integrator implementations - - - - - Initiator - - - org.hibernate.engine.config.internal.ConfigurationServiceInitiator - - - - - Implementations - - - org.hibernate.engine.config.internal.ConfigurationServiceImpl - - - - -
- -
- <interfacename>ConnectionProvider</interfacename> - - - Notes - - - Defines the means in which Hibernate can obtain and release - java.sql.Connection instances for its use. - - - - - Initiator - - - ConnectionProviderInitiator - - - - - Implementations - - - - - org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider - - provides connection pooling based on integration with the C3P0 connection pooling library - - - - - DatasourceConnectionProviderImpl - - provides connection managed delegated to a - javax.sql.DataSource - - - - - DriverManagerConnectionProviderImpl - - provides rudimentary connection pooling based on simple custom pool. Note intended - production use! - - - - - org.hibernate.service.jdbc.connections.internal.ProxoolConnectionProvider - - provides connection pooling based on integration with the proxool connection pooling library - - - - - UserSuppliedConnectionProviderImpl - - Provides no connection support. Indicates the user will supply connections to Hibernate directly. - Not recommended for use. - - - - - - -
- -
- <interfacename>org.hibernate.engine.jdbc.dialect.spi.DialectFactory</interfacename> - - - Notes - - - Contract for Hibernate to obtain org.hibernate.dialect.Dialect - instance to use. This is either explicitly defined by the - hibernate.dialect property or determined by the - service which is a delegate to this service. - - - - - Initiator - - - org.hibernate.engine.jdbc.dialect.internal.DialectFactoryInitiator - - - - - Implementations - - - org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl - - - - -
- -
- <interfacename>org.hibernate.engine.jdbc.dialect.spi.DialectResolver</interfacename> - - - Notes - - - Provides resolution of org.hibernate.dialect.Dialect to use based on - information extracted from JDBC metadata. - - - The standard resolver implementation acts as a chain, delegating to a series of individual - resolvers. The standard Hibernate resolution behavior is contained in - org.hibernate.engine.jdbc.dialect.internal.StandardDatabaseMetaDataDialectResolver. - org.hibernate.engine.jdbc.dialect.internal.DialectResolverInitiator - also consults with the hibernate.dialect_resolvers setting for any - custom resolvers. - - - - - Initiator - - - org.hibernate.engine.jdbc.dialect.internal.DialectResolverInitiator - - - - - Implementations - - - org.hibernate.engine.jdbc.dialect.internal.DialectResolverSet - - - - -
- -
- <interfacename>org.hibernate.engine.jdbc.spi.JdbcServices</interfacename> - - - Notes - - - Special type of service that aggregates together a number of other services and provides - a higher-level set of functionality. - - - - - Initiator - - - org.hibernate.engine.jdbc.internal.JdbcServicesInitiator - - - - - Implementations - - - org.hibernate.engine.jdbc.internal.JdbcServicesImpl - - - - -
- -
- <interfacename>org.hibernate.jmx.spi.JmxService</interfacename> - - - Notes - - - Provides simplified access to JMX related features needed by Hibernate. - - - - - Initiator - - - org.hibernate.jmx.internal.JmxServiceInitiator - - - - - Implementations - - - - - org.hibernate.jmx.internal.DisabledJmxServiceImpl - - A no-op implementation when JMX functionality is disabled. - - - - - org.hibernate.jmx.internal.JmxServiceImpl - - Standard implementation of JMX handling - - - - - - -
- -
- <interfacename>org.hibernate.engine.jndi.spi.JndiService</interfacename> - - - Notes - - - Provides simplified access to JNDI related features needed by Hibernate. - - - - - Initiator - - - org.hibernate.engine.jndi.internal.JndiServiceInitiator - - - - - Implementations - - - org.hibernate.engine.jndi.internal.JndiServiceImpl - - - - -
- -
- <interfacename>org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform</interfacename> - - - Notes - - - Provides an abstraction from the underlying JTA platform when JTA features are used. - - - - - Initiator - - - org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - - - - As of 5.0 support has been completely removed for mapping against legacy - org.hibernate.transaction.TransactionManagerLookup - names and custom implementations. Applications implementing - org.hibernate.transaction.TransactionManagerLookup - or using the hibernate.transaction.manager_lookup_class setting - should update to use JtaPlatform. - - - - - - Implementations - - - - - org.hibernate.engine.transaction.jta.platform.internal.BitronixJtaPlatform - - Integration with the Bitronix stand-alone transaction manager. Can also be referenced - using the Bitronix configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.BorlandEnterpriseServerJtaPlatform - - Integration with the transaction manager as deployed within a Borland Enterprise Server. - Can also be referenced using the Borland configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.JBossAppServerJtaPlatform - - Integration with the transaction manager as deployed within a JBoss Application Server. - Can also be referenced using the JBossAS configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform - - Integration with the JBoss Transactions stand-alone transaction manager. - Can also be referenced using the JBossTS configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.JOTMJtaPlatform - - Integration with the JOTM stand-alone transaction manager. Can also be referenced - using the JOTM configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.JOnASJtaPlatform - - Integration with the JOnAS transaction manager. Can also be referenced using the - JOnAS configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.JRun4JtaPlatform - - Integration with the transaction manager as deployed in a JRun 4 application server. - Can also be referenced using the JRun4 configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform - - No-op version when no JTA set up is configured - - - - - org.hibernate.engine.transaction.jta.platform.internal.OC4JJtaPlatform - - Integration with transaction manager as deployed in an OC4J (Oracle) application - Can also be referenced using the OC4J configuration short name - server. - - - - - org.hibernate.engine.transaction.jta.platform.internal.OrionJtaPlatform - - Integration with transaction manager as deployed in an Orion application server. - Can also be referenced using the Orion configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.ResinJtaPlatform - - Integration with transaction manager as deployed in a Resin application server. - Can also be referenced using the Resin configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.SunOneJtaPlatform - - Integration with transaction manager as deployed in a Sun ONE (7 and above) - application server. Can also be referenced using the SunOne - configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.WebSphereExtendedJtaPlatform - - Integration with transaction manager as deployed in a WebSphere Application Server - (6 and above). Can also be referenced using the WebSphereExtended - configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.WebSphereJtaPlatform - - Integration with transaction manager as deployed in a WebSphere Application Server - (4, 5.0 and 5.1). Can also be referenced using the WebSphere - configuration short name - - - - - org.hibernate.engine.transaction.jta.platform.internal.WeblogicJtaPlatform - - Integration with transaction manager as deployed in a Weblogic application server. - Can also be referenced using the Weblogic configuration short name - - - - - - -
- -
- <interfacename>MultiTenantConnectionProvider</interfacename> - - - Notes - - - A variation of providing access to JDBC - connections in multi-tenant environments. - - - - - Initiator - - - N/A - - - - - Implementations - - - Intended that users provide appropriate implementation if needed. - - - - -
- -
- <interfacename>org.hibernate.persister.spi.PersisterClassResolver</interfacename> - - - Notes - - - Contract for determining the appropriate - org.hibernate.persister.entity.EntityPersister - or org.hibernate.persister.collection.CollectionPersister - implementation class to use given an entity or collection mapping. - - - - - Initiator - - - org.hibernate.persister.internal.PersisterClassResolverInitiator - - - - - Implementations - - - org.hibernate.persister.internal.StandardPersisterClassResolver - - - - -
- -
- <interfacename>org.hibernate.persister.spi.PersisterFactory</interfacename> - - - Notes - - - Factory for creating - org.hibernate.persister.entity.EntityPersister - and org.hibernate.persister.collection.CollectionPersister - instances. - - - - - Initiator - - - org.hibernate.persister.internal.PersisterFactoryInitiator - - - - - Implementations - - - org.hibernate.persister.internal.PersisterFactoryImpl - - - - -
- -
- <interfacename>org.hibernate.cache.spi.RegionFactory</interfacename> - - - Notes - - - Integration point for Hibernate's second level cache support. - - - - - Initiator - - - org.hibernate.cache.internal.RegionFactoryInitiator - - - - - Implementations - - - - - org.hibernate.cache.ehcache.EhCacheRegionFactory - - - - - org.hibernate.cache.infinispan.InfinispanRegionFactory - - - - - org.hibernate.cache.infinispan.JndiInfinispanRegionFactory - - - - - org.hibernate.cache.internal.NoCachingRegionFactory - - - - - org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory - - - - - - -
- -
- <interfacename>org.hibernate.service.spi.SessionFactoryServiceRegistryFactory</interfacename> - - - Notes - - - Factory for creating - org.hibernate.service.spi.SessionFactoryServiceRegistry - instances which acts as a specialized - org.hibernate.service.ServiceRegistry for - org.hibernate.SessionFactory scoped services. See - for more details. - - - - - Initiator - - - org.hibernate.service.internal.SessionFactoryServiceRegistryFactoryInitiator - - - - - Implementations - - - org.hibernate.service.internal.SessionFactoryServiceRegistryFactoryImpl - - - - -
- -
- <interfacename>org.hibernate.stat.Statistics</interfacename> - - - Notes - - - Contract for exposing collected statistics. The statistics are collected through the - org.hibernate.stat.spi.StatisticsImplementor contract. - - - - - Initiator - - - org.hibernate.stat.internal.StatisticsInitiator - - - Defines a hibernate.stats.factory setting to allow - configuring the - org.hibernate.stat.spi.StatisticsFactory to use internally - when building the actual - org.hibernate.stat.Statistics instance. - - - - - Implementations - - - org.hibernate.stat.internal.ConcurrentStatisticsImpl - - - The default org.hibernate.stat.spi.StatisticsFactory - implementation builds a - org.hibernate.stat.internal.ConcurrentStatisticsImpl instance. - - - - -
- -
- <interfacename>org.hibernate.engine.transaction.spi.TransactionFactory</interfacename> - - - Notes - - - Strategy defining how Hibernate's org.hibernate.Transaction - API maps to the underlying transaction approach. - - - - - Initiator - - - org.hibernate.engine.transaction.internal.TransactionFactoryInitiator - - - Defines a hibernate.transaction.factory_class setting to allow - configuring which TransactionFactory to use. - hibernate.transaction.factory_class follows the rules set forth - under . - - - - - Implementations - - - - - org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory - - A non-JTA strategy in which the transactions are managed using the JDBC - java.sql.Connection. This implementation's short - name is jdbc. - - - - - org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory - - A JTA-based strategy in which Hibernate is not controlling the transactions. An - important distinction here is that interaction with the underlying JTA implementation - is done through the - javax.transaction.TransactionManager. This - implementation's short name is cmt. - - - - - org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory - - A JTA-based strategy in which Hibernate *may* be controlling the transactions. An - important distinction here is that interaction with the underlying JTA - implementation is done through the - javax.transaction.UserTransaction. This - implementation's short name is jta. - - - - - - -
- -
- <interfacename>org.hibernate.tool.hbm2ddl.ImportSqlCommandExtractor</interfacename> - - - Notes - - - Contract for extracting statements from import.sql scripts. - - - - - Initiator - - - org.hibernate.tool.hbm2ddl.ImportSqlCommandExtractorInitiator - - - - - Implementations - - - - - org.hibernate.tool.hbm2ddl.SingleLineSqlCommandExtractor - treats each line as a complete SQL statement. Comment lines shall start with - --, // or /* character - sequence. - - - - - org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor - supports instructions/comments and quoted strings spread over multiple lines. Each - statement must end with semicolon. - - - - - - -
- -
- - -
- Custom services - - Once a org.hibernate.service.ServiceRegistry is built it is considered - immutable; the services themselves might accept re-configuration, but immutability here means - adding/replacing services. So another role provided by the - org.hibernate.boot.registry.StandardServiceRegistryBuilder is to allow tweaking of the services - that will be contained in the org.hibernate.service.ServiceRegistry - generated from it. - - - There are 2 means to tell a org.hibernate.boot.registry.StandardServiceRegistryBuilder about - custom services. - - - - - Implement a org.hibernate.boot.registry.StandardServiceInitiator class - to control on-demand construction of the service class and add it to the - org.hibernate.boot.registry.StandardServiceRegistryBuilder via its - addInitiator method. - - - - - Just instantiate the service class and add it to the - org.hibernate.boot.registry.StandardServiceRegistryBuilder via its - addService method. - - - - - Either approach the adding a service approach or the adding an initiator approach are valid for extending a - registry (adding new service roles) and overriding services (replacing service implementations). - -
- - -
- Special service registries - -
- Boot-strap registry - - The boot-strap registry holds services that absolutely have to be available for most things to work. - The main service here is the which is a perfect example. - Even resolving configuration files needs access to class loading services (resource look ups). This - is the root registry (no parent) in normal use. - - - - Instances of boot-strap registries are built using the - org.hibernate.boot.registry.BootstrapServiceRegistryBuilder class. - - - - Using BootstrapServiceRegistryBuilder - - - -
- Bootstrap registry services -
- <interfacename>org.hibernate.boot.registry.classloading.spi.ClassLoaderService</interfacename> - - Hibernate needs to interact with ClassLoaders. However, the manner in which Hibernate - (or any library) should interact with ClassLoaders varies based on the runtime environment - which is hosting the application. Application servers, OSGi containers, and other modular - class loading systems impose very specific class-loading requirements. This service is provides - Hibernate an abstraction from this environmental complexity. And just as importantly, it does - so in a single-swappable-component manner. - - - In terms of interacting with a ClassLoader, Hibernate needs the following capabilities: - - - - the ability to locate application classes - - - - - the ability to locate integration classes - - - - - the ability to locate resources (properties files, xml files, etc) - - - - - the ability to load java.util.ServiceLoader - - - - - - - Currently, the ability to load application classes and the ability to load integration - classes are combined into a single "load class" capability on the service. That may - change in a later release. - - -
- -
- <interfacename>org.hibernate.integrator.spi.IntegratorService</interfacename> - - Applications, add-ons and others all need to integrate with Hibernate which used to require - something, usually the application, to coordinate registering the pieces of each integration - needed on behalf of each integrator. The intent of this service is to allow those integrators - to be discovered and to have them integrate themselves with Hibernate. - - - This service focuses on the discovery aspect. It leverages the standard Java - java.util.ServiceLoader capability provided by the - org.hibernate.boot.registry.classloading.spi.ClassLoaderService - in order to discover implementations of the - org.hibernate.integrator.spi.Integrator contract. - Integrators would simply define a file named - /META-INF/services/org.hibernate.integrator.spi.Integrator and make it - available on the classpath. java.util.ServiceLoader covers the - format of this file in detail, but essentially it list classes by FQN that implement the - org.hibernate.integrator.spi.Integrator one per line. - - - See - -
-
-
- -
- SessionFactory registry - - While it is best practice to treat instances of all the registry types as targeting a given - org.hibernate.SessionFactory, the instances of services in this group - explicitly belong to a single org.hibernate.SessionFactory. The - difference is a matter of timing in when they need to be initiated. Generally they need access to the - org.hibernate.SessionFactory to be initiated. This special registry is - org.hibernate.service.spi.SessionFactoryServiceRegistry - - -
- <interfacename>org.hibernate.event.service.spi.EventListenerRegistry</interfacename> - - - Notes - - - Service for managing event listeners. - - - - - Initiator - - - org.hibernate.event.service.internal.EventListenerServiceInitiator - - - - - Implementations - - - org.hibernate.event.service.internal.EventListenerRegistryImpl - - - - -
-
- -
- - -
- Using services and registries - - Coming soon... - -
- -
- Integrators - - The org.hibernate.integrator.spi.Integrator is intended to provide a simple - means for allowing developers to hook into the process of building a functioning SessionFactory. The - The org.hibernate.integrator.spi.Integrator interface defines 2 methods of - interest: integrate allows us to hook into the building process; - disintegrate allows us to hook into a SessionFactory shutting down. - - There is a 3rd method defined on org.hibernate.integrator.spi.Integrator, - an overloaded form of integrate accepting a - org.hibernate.metamodel.source.MetadataImplementor instead of - org.hibernate.cfg.Configuration. This form is intended for use with the new - metamodel code scheduled for completion in 5.0 + Despite some recent revisionist history, Spring did not invent IoC nor dependency injection nor were + they even the first to bring it into Java. Projects like JBoss MicroContainer and Apache Avalon + pre-date Spring by many years and each did IoC and dependency injection. The concepts in ServiceRegistry + are actually very similar to Apache Avalon. + - See - - - In addition to the discovery approach provided by the IntegratorService, applications can manually - register Integrator implementations when building the BootstrapServiceRegistry. - See + Why not just use an existing IoC framework? The main reason was that this had to be as light-weight and as + small of a footprint as possible. The initial design also had called for Services to be swappable at runtime, + which unfortunately had to be removed due to performance problems in the proxy-based swapping-solution; the + plan is to investigate alternate ways to achieve swap-ability with better performance at a later date. -
- Integrator use-cases + + A Service is associated with a ServiceRegistry. The ServiceRegistry scopes the Service. The + ServiceRegistry manages the lifecycle of the Service. The ServiceRegistry handles injecting dependencies + into the Service (actually both a pull and a push/injection approach are supported). ServiceRegistries are + also hierarchical, meaning a ServiceRegistry can have a parent ServiceRegistry. Services in one registry + can depend on and utilize services in that same registry as well as any parent registries. + + +
+ + +
+ ServiceBinding + + + The association of a given Service to a given ServiceRegistry is called a binding and is represented by the + org.hibernate.service.spi.ServiceBinding interface. Furthermore, the specific + contract between a ServiceBinding and the ServiceRegistry is represented by the + org.hibernate.service.spi.ServiceBinding.ServiceLifecycleOwner interface. + + + + There are 2 ways a Service becomes associated (bound) to a ServiceRegistry. + + the Service can be directly instantiated and then handed to the ServiceRegistry + a ServiceInitiator can be given to the ServiceRegistry (which the ServiceRegistry will use if and when the Service is needed) + + ServiceRegistry implementations register bindings through calls to the overloaded + org.hibernate.service.internal.AbstractServiceRegistryImpl#createServiceBinding + method accepting either a Service instance or a ServiceInitiator instance. + + + + Each specific type of registry defines its own ServiceInitiator specialization. + +
+ + +
+ Types of ServiceRegistries + + + Currently Hibernate utilizes 3 different ServiceRegistry implementations forming a hierarchy. Each + type is a specialization for the purpose of type-safety, but they add no new functionality. + + +
+ BootstrapServiceRegistry + - The main use cases for an org.hibernate.integrator.spi.Integrator right - now are registering event listeners and providing services (see - org.hibernate.integrator.spi.ServiceContributingIntegrator). With 5.0 - we plan on expanding that to allow altering the metamodel describing the mapping between object and - relational models. + The org.hibernate.boot.registry.BootstrapServiceRegistry + holds 3 service and is normally built by means of the + org.hibernate.boot.registry.BootstrapServiceRegistryBuilder factory class. + The builder gives type safe access to customizing these 3 Services. - - Registering event listeners - - + + + This registry holds services that absolutely have to be available for most things in Hibernate to work. + + + + + In normal usage, the BootstrapServiceRegistry has no parent. + + + + The services of the BootstrapServiceRegistry cannot be extended (added to) nor overridden (replaced). + + +
+ ClassLoaderService + + + The service role for this service is org.hibernate.boot.registry.classloading.spi.ClassLoaderService. + + + + This service defines Hibernate's ability to interact with ClassLoaders. The manner in which + Hibernate (or any library) should interact with ClassLoaders varies based on the runtime environment + which is hosting the application. Application servers, OSGi containers, and other modular class + loading systems impose very specific class-loading requirements. This service is provides + Hibernate an abstraction from this environmental complexity. And just as importantly, it does so + in a centralized, swappable manner. + + + + The specific capabilities exposed on this service include: + + Locating Class references by name. This includes application classes as well as "integration" classes. + Locating resources (properties files, xml files, etc) as "classpath resources" + Interacting with java.util.ServiceLoader, Java's own service provider discovery mechanism + + +
+ +
+ IntegratorService + + + The service role for this service is org.hibernate.integrator.spi.IntegratorService. + + + + Applications, third-party integrators and others all need to integrate with Hibernate. Historically + this used to require something (usually the application) to coordinate registering the pieces of each + integration needed on behalf of each integration. The + org.hibernate.integrator.spi.Integrator contract formalized this + "integration SPI". The IntegratorService manages all known integrators. + + + + + The concept of "Integrator" is still being actively defined and developed. Expect changes in + these SPIs. + + + + + There are 2 ways an integrator becomes known. + + + + The integrator may be manually registered by calling + BootstrapServiceRegistryBuilder#with(Integrator) + + + + + The integrator may be discovered, leveraging the standard Java ServiceLoader + capability provided by the ClassLoaderService. Integrators would simply define a file + named /META-INF/services/org.hibernate.integrator.spi.Integrator + and make it available on the classpath. ServiceLoader covers the format of this file + in detail, but essentially it lists classes by FQN that implement Integrator one + per line. + + + + +
+ +
+ StrategySelector + + + The service role for this service is org.hibernate.boot.registry.selector.spi.StrategySelector. + + + + Think of this as the "short naming" service. Historically to configure Hibernate users would + often need to give FQN references to internal Hibernate classes. Of course this has caused lots + of problems as we refactor internal code and move these classes around into different package + structures. Enter the concept of short-naming, using a well defined and well known "short name" + for the strategy/implementation class. + + + + The short name mappings in this service can be managed, even by applications and integrators + which can be very powerful. For more information on this aspect, see: + + BootstrapServiceRegistryBuilder#applyStrategySelector + BootstrapServiceRegistryBuilder#applyStrategySelectors + + org.hibernate.boot.registry.selector.StrategyRegistrationProvider + via ServiceLoader discovery + + + StrategySelector#registerStrategyImplementor` / + StrategySelector#unRegisterStrategyImplementor + + + +
+
+ + +
+ StandardServiceRegistry + + + The org.hibernate.boot.registry.StandardServiceRegistry defines the + main Hibernate ServiceRegistry, building on the BootstrapServiceRegistry (BootstrapServiceRegistry is + its parent). This registry is generally built using the + org.hibernate.boot.registry.StandardServiceRegistryBuilder class. By default + it holds most of the Services used by Hibernate. For the full list of Services typically held in the + StandardServiceRegistry, see the source code of org.hibernate.service.StandardServiceInitiators. + Some particular StandardServiceRegistry Services of note include: + + + + In normal usage, the parent of the StandardServiceRegistry is the BootstrapServiceRegistry. + + + + The services of the StandardServiceRegistry can be extended (added to) and overridden (replaced). + + +
+ ConnectionProvider/MultiTenantConnectionProvider + + The Service providing Hibernate with Connections as needed. Comes in 2 distinct (and mutually + exclusive) roles: + + + org.hibernate.engine.jdbc.connections.spi.ConnectionProvider - + provides Connections in normal environments + + + org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider - + provides (tenant-specific) Connections in multi-tenant environments + + + +
+ +
+ JdbcServices + + org.hibernate.engine.jdbc.spi.JdbcServices is an aggregator + Service (a Service that aggregates other Services) exposing unified functionality around JDBC + accessibility. + +
+ +
+ TransactionCoordinatorBuilder + + org.hibernate.resource.transaction.TransactionCoordinatorBuilder + is used by Hibernate to integrate with and underlying transaction system. It is responsible for + building org.hibernate.resource.transaction.TransactionCoordinator + instances for use by each Hibernate Session. + +
+ +
+ JtaPlatform + + When using a JTA-based TransactionCoordinatorBuilder, the + org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform Service + provides Hibernate access to the JTA TransactionManager and UserTransaction, as well handling + Synchronization registration. + +
+ +
+ JndiService + + The org.hibernate.engine.jndi.spi.JndiService service is used + by Hibernate to interact with JNDI contexts. Hibernate's default JndiService assumes just a single + InitialContext. + +
+ +
+ RegionFactory + + The org.hibernate.cache.spi.RegionFactory service defines the + integration with third party cache implementors as second-level caching providers. + +
+ +
+ SessionFactoryServiceRegistryFactory + + org.hibernate.service.spi.SessionFactoryServiceRegistryFactory is a + service that acts as a factory for building the third type of ServiceRegistry + (the SessionFactoryServiceRegistry) which we will discuss next. I opted for the "factory as + service" approach because in the current design there is really not a good exposed hook-in spot + for when the SessionFactoryServiceRegistry needs to be built. + +
+
+ + +
+ SessionFactoryServiceRegistry + + + org.hibernate.service.spi.SessionFactoryServiceRegistry is the 3rd + standard Hibernate ServiceRegistry. SessionFactoryServiceRegistry is designed to hold Services which + need access to the SessionFactory. + + + + Typically its parent registry is the StandardServiceRegistry. + + + + + Integrators, as it stands in 4.x, operate on the SessionFactoryServiceRegistry... + + + + + Currently SessionFactoryServiceRegistry holds just 4 Services: + + +
+ EventListenerRegistry + + org.hibernate.event.service.spi.EventListenerRegistry is the main + service managed in the SessionFactoryServiceRegistry. The is the Service that manages all of + Hibernate's event listeners. A major use-case for Integrators is to alter the listener registry. + + + If doing custom listener registration, it is important to understand the + org.hibernate.event.service.spi.DuplicationStrategy and its effect on + registration. The basic idea is to tell Hibernate: + + what makes a listener a duplicate + how to handle duplicate registrations (error, first wins, last wins) + + +
+ +
+ StatisticsImplementor + + org.hibernate.stat.spi.StatisticsImplementor is the SPI portion of + the Statistics API; the collector portion, if you will. + +
+ +
+ NativeQueryInterpreter + + org.hibernate.engine.query.spi.NativeQueryInterpreter is the + service Hibernate uses for interpreting native queries. Exists as a service mainly so that + integrations such as OGM can override it. + +
+ +
+ CacheImplementor + + To be honest, I have no idea why this is a service... :) + +
+ \ No newline at end of file diff --git a/documentation/src/main/docbook/integration/en-US/images/hibernate_logo_a.png b/documentation/src/main/docbook/integration/en-US/images/hibernate_logo_a.png new file mode 100644 index 0000000000000000000000000000000000000000..0a343c4bca60a2d585b3d9efe11c9a328b4c83cc GIT binary patch literal 31862 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 QNpeyu3hH~~ + + + For details on implementing a custom TransactionCoordinatorBuilder, or simply better understanding + how it works, see the Integrations Guide + + + Hibernate uses JDBC connections and JTA resources directly, without adding any additional locking behavior. Hibernate does not lock objects in memory. The behavior defined by the isolation level of your database