HHH-15170 - Dedicated chapter for "Build Tool Support"

HHH-15171 - Add discussion of the Ant Plugin
This commit is contained in:
Steve Ebersole 2022-04-05 16:13:03 -05:00
parent 17bb4aa066
commit 84cf4524ea
5 changed files with 0 additions and 721 deletions

View File

@ -1,63 +0,0 @@
[[jpa-bootstrap-guide]]
= Bootstrapping Hibernate Jakarta Persistence
:toc:
Bootstrapping Hibernate as a Jakarta Persistence provider can be done in a Jakarta Persistence-spec compliant manner or using a proprietary
bootstrapping approach. The standardized approach has some limitations in certain environments. But aside from
those limitations, it is *highly* recommended that you use Jakarta Persistence-standardized bootstrapping.
NOTE: Under the covers, all of Hibernate's Jakarta Persistence bootstrapping makes use of its native bootstrapping. Be sure to see
the _Native Bootstrapping_ guide as well.
== Jakarta Persistence compliant bootstrapping
In Jakarta Persistence we are ultimately interested in bootstrapping an `jakarta.persistence.EntityManagerFactory` instance. The
Jakarta Persistence specification defines 2 primary standardized bootstrap approaches depending on how the application intends to
access the `jakarta.persistence.EntityManager` instances from an `EntityManagerFactory`. It uses the terms "EE" and
"SE" for these 2 approaches, but those terms are very misleading in this context. What the Jakarta Persistence spec calls EE
bootstrapping is cases where a container (EE, OSGi, etc) will manage and inject the persistence context on behalf
of the application. What it calls SE bootstrapping is everything else. We will use the terms
container-bootstrapping and application-bootstrapping in this guide.
NOTE: If you would like additional details on accessing and using `EntityManager` instances, sections 7.6
and 7.7 of the Jakarta Persistence specification cover container-managed and application-managed EntityManagers,
respectively.
=== Container-bootstrapping
The container will build an `EntityManagerFactory` for each persistent-unit defined in the deployment's
`META-INF/persistence.xml` and make that available to the application for injection via the
`jakarta.persistence.PersistenceUnit` annotation or via JNDI lookup.
[[container-bootstrap-injection-example]]
.Injecting a EntityManagerFactory
====
[source, JAVA]
----
@PersistenceUnit
EntityManagerFactory emf;
----
====
=== Application-bootstrapping
Rather than something a container building the `EntityManagerFactory` for the application, the application
can build the `EntityManagerFactory` using the `jakarta.persistence.Persistence` bootstrap class. The application
creates an entity manager factory by calling the createEntityManagerFactory method:
[[application-bootstrap-example]]
.Application bootstrapped EntityManagerFactory
====
[source, JAVA]
----
// Create an EMF for our CRM persistence-unit.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("CRM");
----
====
== Proprietary 2-phase bootstrapping
todo: document EntityManagerFactoryBuilder...

View File

@ -1,127 +0,0 @@
[[legacy-boostrap-guide]]
= Legacy Bootstrapping
:toc:
The legacy way to bootstrap a `SessionFactory` is via the `org.hibernate.cfg.Configuration` object.
`Configuration` represents, essentially, a single point for specifying all aspects of building
the `SessionFactory`: everything from settings, to mappings, to strategies, etc. I like to think of
`Configuration` as a big pot to which we add a bunch of stuff (mappings, settings, etc) and from which
we eventually get a `SessionFactory`.
NOTE: There are some significant draw backs to this approach which led to its deprecation and the development
of the new approach, which is discussed in the _Native Bootstrapping_ guide. `Configuration` is deprecated but
still available for use, in a limited form that eliminates these draw backs. "Under the covers", Configuration
uses the new bootstrapping code, so the things available there as also available here in terms of
auto-discovery.
== Usage
You can obtain the `Configuration` by instantiating it directly. You then specify mapping metadata (XML
mapping documents, annotated classes) that describe your applications object model and its mapping to a
SQL database.
If XML mapping files are in the classpath, use addResource(). For example:
====
[source, JAVA]
----
Configuration cfg = new Configuration()
// addResource does a classpath resource lookup
.addResource("Item.hbm.xml")
.addResource("Bid.hbm.xml")
// calls addResource using "/org/hibernate/auction/User.hbm.xml"
.addClass(`org.hibernate.auction.User.class`)
// parses Address class for mapping annotations
.addAnnotatedClass( Address.class )
// reads package-level (package-info.class) annotations in the named package
.addPackage( "org.hibernate.auction" )
----
====
`Configuration` also allows you to specify configuration properties. For example:
====
[source, JAVA]
----
Configuration cfg = new Configuration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect")
.setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
.setProperty("hibernate.order_updates", "true");
----
====
There are other ways to specify configuration properties, including:
* Place a file named hibernate.properties in a root directory of the classpath.
* Place a file named hibernate.properties in a root directory of the classpath.
* Pass an instance of java.util.Properties to `Configuration#setProperties`.
* Set System properties using Java `-Dproperty=value`.
* Include `<property/>` elements in `hibernate.cfg.xml`
== Migration
Mapping Configuration methods to the corresponding methods in the new API..
=== Mapping metadata
`Configuration#addFile`::
`MetadataSources#addFile`
`Configuration#add(XmlDocument)`::
No replacement.
`Configuration#addXML`::
No replacement.
`Configuration#addCacheableFile`::
`MetadataSources#addCacheableFile`
`Configuration#addURL`::
`MetadataSources#addURL`
`Configuration#addInputStream`::
`MetadataSources#addInputStream`
`Configuration#addResource`::
`MetadataSources#addResource`
`Configuration#addClass`::
`MetadataSources#addClass`
`Configuration#addAnnotatedClass`::
`MetadataSources#addAnnotatedClass`
`Configuration#addPackage`::
`MetadataSources#addPackage`
`Configuration#addJar`::
`MetadataSources#addJar`
`Configuration#addDirectory`::
`MetadataSources#addDirectory`
`Configuration#registerTypeContributor`::
`MetadataBuilder#applyTypes`
`Configuration#registerTypeOverride`::
`MetadataBuilder#applyBasicType`
=== Settings
`Configuration#setProperty`::
`StandardServiceRegistryBuilder#applySetting`
`Configuration#setProperties`::
No replacement.
`Configuration#addProperties`::
`StandardServiceRegistryBuilder#applySettings`
`Configuration#setNamingStrategy`::
No replacement. NamingStrategy split into implicit/physical strategies
`Configuration#setImplicitNamingStrategy`::
`MetadataBuilder#setImplicitNamingStrategy`
`Configuration#setPhysicalNamingStrategy`::
`MetadataBuilder#setPhysicalNamingStrategy`
`Configuration#configure`::
`StandardServiceRegistryBuilder#configure`
`Configuration#setInterceptor`::
`SessionFactoryBuilder#applyInterceptor`
`Configuration#setEntityNotFoundDelegate`::
`SessionFactoryBuilder#applyEntityNotFoundDelegate`
`Configuration#setSessionFactoryObserver`::
`SessionFactoryBuilder#addSessionFactoryObservers`
`Configuration#setCurrentTenantIdentifierResolver`::
`SessionFactoryBuilder#applyCurrentTenantIdentifierResolver`

View File

@ -1,274 +0,0 @@
[[native-bootstrap]]
= Native Bootstrapping
:toc:
This guide discusses the process of bootstrapping a Hibernate `org.hibernate.SessionFactory`. It also
discusses the ways in which applications and integrators can hook-in to and affect that process. This
bootstrapping process is defined in 2 distinct steps. The first step is the building of a ServiceRegistry
holding the services Hibernate will need at bootstrap- and runtime. The second step is the building of
a Metadata object representing the mapping information for the application's model and its mapping to
the database.
NOTE: Prior to version 5.0 applications bootstrapped a `SessionFactory` is via the
`org.hibernate.cfg.Configuration` object. That approach is still supported in a slightly limited manner.
See the _Legacy Bootstrapping_ guide for details.
== Building the ServiceRegistry
Actually we are concerned with building 2 different ServiceRegistries:
* `org.hibernate.boot.registry.BootstrapServiceRegistry`
* `org.hibernate.boot.registry.StandardServiceRegistry`
Each of these is built from a builder, `org.hibernate.boot.registry.BootstrapServiceRegistryBuilder`
and `org.hibernate.boot.registry.StandardServiceRegistryBuilder` respectively.
NOTE: For more information on ServiceRegistries in general, see the _Services and Registries_ guide.
=== BootstrapServiceRegistry
The `BootstrapServiceRegistry` is intended to hold services that Hibernate needs at both bootstrap and run time.
This boils down to 3 services:
* `ClassLoaderService` - which controls how Hibernate interacts with ClassLoaders
* `IntegratorService` - which controls the management ands discovery of `org.hibernate.integrator.spi.Integrator` instances.
* `StrategySelector` - which control how Hibernate resolves implementations of various strategy
contracts. This is a very powerful service, but a full discussion of it is beyond the scope
of this guide.
If you are ok with the default behavior of Hibernate in regards to these BootstrapServiceRegistry services
(which is quite often the case, especially in SE environments) building the BootstrapServiceRegistry can be skipped.
If you wish to alter how the `BootstrapServiceRegistry` is built, you would use the `BootstrapServiceRegistryBuilder`:
[[bootstrap-registry-builder-example]]
.Building a BootstrapServiceRegistry
====
[source, JAVA]
----
BootstrapServiceRegistryBuilder bootstrapRegistryBuilder
= new BootstrapServiceRegistryBuilder();
// add a special ClassLoader
bootstrapRegistryBuilder.applyClassLoader( mySpecialClassLoader );
// manually add an Integrator
bootstrapRegistryBuilder.applyIntegrator( mySpecialIntegrator );
...
BootstrapServiceRegistry bootstrapRegistry = bootstrapRegistryBuilder.build();
----
====
The services of the `BootstrapServiceRegistry` cannot be extended (added to) nor overridden (replaced).
=== StandardServiceRegistry
The services of the `StandardServiceRegistry` may be extended and overridden.
A `StandardServiceRegistry` is built through the `StandardServiceRegistryBuilder` which can be constructed in
one of 2 ways:
[[standard-registry-builder-example1]]
.Building a StandardServiceRegistryBuilder with a supplied BootstrapServiceRegistry
====
[source, JAVA]
----
BootstrapServiceRegistry bootstrapRegistry = ...;
StandardServiceRegistryBuilder standardRegistryBuilder
= new StandardServiceRegistryBuilder( bootstrapRegistry );
----
====
[[standard-registry-builder-example2]]
.Building a StandardServiceRegistryBuilder without a supplied BootstrapServiceRegistry
====
[source, JAVA]
----
StandardServiceRegistryBuilder standardRegistryBuilder
= new StandardServiceRegistryBuilder();
----
====
The second form will create a `BootstrapServiceRegistry` on the fly with default behavior.
A `StandardServiceRegistry` is also highly configurable via the `StandardServiceRegistryBuilder` API. See the
`StandardServiceRegistryBuilder` javadocs for full details. Some specific methods of interest:
[[standard-registry-builder-example3]]
.Configuring StandardServiceRegistryBuilder
====
[source, JAVA]
----
StandardServiceRegistryBuilder standardRegistryBuilder = ...;
// load some properties via resource lookup
standardRegistryBuilder.loadProperties( "org/hibernate/example/MyProperties.properties" );
// configure the registry from a resource lookup for a cfg.xml config file
standardRegistryBuilder.configure( "org/hibernate/example/MyCfg.xml" );
// apply a random setting
standardRegistryBuilder.applySetting( "myProp", "some value" );
// apply a service initiator
standardRegistryBuilder.addInitiator( new CustomServiceInitiator() );
// apply a service impl
standardRegistryBuilder.addService( SomeCustomService.class, new SomeCustomServiceImpl() );
// and finally build the StandardServiceRegistry
StandardServiceRegistry standardRegistry = standardRegistryBuilder.build();
----
====
== Building the Metadata
The `org.hibernate.boot.Metadata` object contains the parsed representations of an application's
domain model and its mapping to a database. The first thing we obviously need to build a parsed
representation is the source information to be parsed (annotated classes, `hbm.xml` files, `orm.xml` files). This is
the purpose of `org.hibernate.boot.MetadataSources`.
[[MetadataSources-example]]
.Configuring a MetadataSources
====
[source, JAVA]
----
MetadataSources sources = new MetadataSources( standardRegistry );
// alternatively, we can build the MetadataSources without passing
// a service registry, in which case it will build a default
// BootstrapServiceRegistry to use
// MetadataSources sources = new MetadataSources();
// add a class using annotations for mapping
sources.addAnnotatedClass( MyEntity.class );
// add the name of a class using annotations for mapping.
// differs from above in that accessing the Class is deferred which is
// important if using runtime bytecode-enhancement
sources.addAnnotatedClassName( "org.hibernate.example.Customer" );
// Adds the named hbm.xml resource as a source: which performs the
// classpath lookup and parses the XML
sources.addResource( "org/hibernate/example/Order.hbm.xml" );
// Adds the named orm.xml resource as a source: which performs the
// classpath lookup and parses the XML
sources.addResource( "org/hibernate/example/Product.orm.xml" );
----
====
`MetadataSources` has many other methods as well; explore its API and javadocs for more information. Also,
all methods on `MetadataSources` allow for chaining should you prefer that style.
[[MetadataSources-chaining-example]]
.Configuring a MetadataSources with method chaining
====
[source, JAVA]
----
MetadataSources sources = new MetadataSources( standardRegistry )
.addAnnotatedClass( MyEntity.class )
.addAnnotatedClassName( "org.hibernate.example.Customer" )
.addResource( "org/hibernate/example/Order.hbm.xml" )
.addResource( "org/hibernate/example/Product.orm.xml" );
----
====
Once we have the sources of mapping information defined, we need to build the `Metadata` object. If you are
ok with the default behavior in building the `Metadata` (or if relying on a `MetadataBuilderInitializer` - see below)
then you can simply call `MetadataSources#buildMetadata`.
NOTE : Notice that a ServiceRegistry can be passed at a number of points in this bootstrapping process. The suggested
approach is to build a `StandardServiceRegistry` yourself and pass that along to the `MetadataSources` constructor.
From there, `MetadataBuilder`, `Metadata`, `SessionFactoryBuilder` and `SessionFactory` will all pick up that
same `StandardServiceRegistry`.
However, if you wish to adjust the process of building `Metadata` from `MetadataSources` you will need to use
the `MetadataBuilder` as obtained via `MetadataSources#getMetadataBuilder`. `MetadataBuilder` allows a lot of control
over the `Metadata` building process. See its javadocs for full details.
[[MetadataBuilder-example]]
.Building Metadata via MetadataBuilder
====
[source, JAVA]
----
MetadataBuilder metadataBuilder = sources.getMetadataBuilder();
// Use the Jakarta Persistence-compliant implicit naming strategy
metadataBuilder.applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE );
// specify the schema name to use for tables, etc when none is explicitly specified
metadataBuilder.applyImplicitSchemaName( "my_default_schema" );
Metadata metadata = metadataBuilder.build();
----
====
== Building the SessionFactory
Much like we've discussed above, if you are ok with the default behavior of building a `SessionFactory`
from a `Metadata` reference, you can simply call `Metadata#buildSessionFactory`. However, if you would like to
adjust that building process you will need to use `SessionFactoryBuilder` as obtained via
`Metadata#getSessionFactoryBuilder`. See the `SessionFactoryBuilder` javadocs for details of the control it allows
over the `SessionFactory` building process.
[[SessionFactoryBuilder-example]]
.Building SessionFactory via SessionFactoryBuilder
====
[source, JAVA]
----
SessionFactoryBuilder sessionFactoryBuilder = metadata.getSessionFactoryBuilder();
// Supply a SessionFactory-level Interceptor
sessionFactoryBuilder.applyInterceptor( new MySessionFactoryInterceptor() );
// Add a custom observer
sessionFactoryBuilder.addSessionFactoryObservers( new MySessionFactoryObserver() );
// Apply a CDI BeanManager (for Jakarta Persistence event listeners)
sessionFactoryBuilder.applyBeanManager( getBeanManagerFromSomewhere() );
SessionFactory sessionFactory = sessionFactoryBuilder.build();
----
====
== Putting It All Together
The bootstrapping API is quite flexible, but in most cases it makes the most sense to think of
it as a 3 step process:
1. Build the `StandardServiceRegistry`
2. Build the `Metadata`
3. Use those 2 things to build the `SessionFactory`
[[Putting-It-All-Together-ex1]]
.Building SessionFactory via SessionFactoryBuilder
====
[source, JAVA]
----
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure( "org/hibernate/example/MyCfg.xml" )
.build();
Metadata metadata = new MetadataSources( standardRegistry )
.addAnnotatedClass( MyEntity.class )
.addAnnotatedClassName( "org.hibernate.example.Customer" )
.addResource( "org/hibernate/example/Order.hbm.xml" )
.addResource( "org/hibernate/example/Product.orm.xml" )
.getMetadataBuilder()
.applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE )
.build();
SessionFactory sessionFactory = metadata.getSessionFactoryBuilder()
.applyBeanManager( getBeanManagerFromSomewhere() )
.build();
----
====
== Integration Points
=== Integrator
=== ServiceContributor
=== TypeContributor
=== MetadataSourcesContributor
=== MetadataBuilderInitializer
=== SessionFactoryBuilderInitializer (todo)
=== SessionFactoryObserver

View File

@ -1,162 +0,0 @@
[[bytecode-enhancement-guide]]
= Bytecode Enhancement
:toc:
This guide covers Hibernate's ability to enhance an applications domain model, the ways to perform that
enhancement and the capabilities introduced into the domain model by the enhancement.
== The capabilities
Hibernate will enhance the classes in an application's domain model in order to add one or more of the
following capabilities:
. Lazy state initialization
. Dirtiness tracking
. Automatic bi-directional association management
. Performance optimizations
todo : explain each in detail
== Performing enhancement
Ultimately all enhancement is handled by the `org.hibernate.bytecode.enhance.spi.Enhancer` class. Custom means to
enhancement can certainly be crafted on top of Enhancer, but that is beyond the scope of this guide. Here we
will focus on the means Hibernate already exposes for performing these enhancements.
=== Runtime enhancement
Currently runtime enhancement of the domain model is only supported in managed Jakarta Persistence environments following the Jakarta Persistence defined SPI for performing class transformations.
Even then, this support is disabled by default. To enable runtime enhancement, specify one of the following configuration properties:
`*hibernate.enhancer.enableDirtyTracking*` (e.g. `true` or `false` (default value))::
Enable dirty tracking feature in runtime bytecode enhancement.
`*hibernate.enhancer.enableLazyInitialization*` (e.g. `true` or `false` (default value))::
Enable lazy loading feature in runtime bytecode enhancement. This way, even basic types (e.g. `@Basic(fetch = FetchType.LAZY`)) can be fetched lazily.
`*hibernate.enhancer.enableAssociationManagement*` (e.g. `true` or `false` (default value))::
Enable association management feature in runtime bytecode enhancement which automatically synchronizes a bidirectional association when only one side is changed.
=== Build-time enhancement
Hibernate also offers the ability to integrate the enhancement of the domain model as part of the
normal build cycle of that domain model. Gradle, Ant and Maven are all supported. One possible benefit
of this approach is that the enhanced classes are what gets added to the jar and can then be used on both
sides of serialization.
=== Gradle Plugin
Hibernate provides a Gradle plugin that is capable of providing build-time enhancement of the domain model as they are
compiled as part of a Gradle build. To use the plugin a project would first need to apply it:
[[gradle-plugin-apply-example]]
.Apply the plugin
====
[source, GROOVY]
----
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath "org.hibernate:hibernate-gradle-plugin:5.1.0.Final"
}
}
apply plugin: 'org.hibernate.orm'
----
====
At the moment there is not much to configure with regard to the Enhancer, but what is configurable is exposed through a DSL extension registered.
By default, enhancement will not be done (in preparation for when this Gradle plugin offers additional capabilities).
To enable it you must configure the following DSL extension:
[[gradle-plugin-apply-example]]
.Apply the plugin
====
[source, GROOVY]
----
hibernate {
enhance {
enableLazyInitialization= true
enableDirtyTracking = true
enableAssociationManagement = true
enableExtendedEnhancement = false
}
}
----
====
Currently the "enhance" extension supports 4 properties:
* `enableLazyInitialization`
* `enableDirtyTracking`
* `enableAssociationManagement`
* `enableExtendedEnhancement`
Once enhancement overall is enabled, the default for the first 3 properties is `true`. Field access is not enhanced by
default, as it can potentially trigger enhancement of code outside the entities, and also because it assumes that all
the target entities are enhanced, which may not always be the case.
=== Maven Plugin
The Hibernate Maven plugin provides a convenient way to enhance the domain model at build-time when using Maven as the
build environment. Much like the Gradle plugin, the current bytecode enhancement capabilities that can be configured
on the plugin are:
* `enableLazyInitialization`
* `enableDirtyTracking`
* `enableAssociationManagement`
* `enableExtendedEnhancement`
Field access is not enhanced by default, because it can potentially trigger enhancement of code outside the entities.
Other capabilities are enabled by default. Even if the plugin is enabled, the bytecode enhancement can be bypassed by
disabling all the capabilities.
There is also a parameter `failOnError` that controls what happens in case of error. Default behavior is to fail the
build, but it can be set so that only a warning is issued.
To use the Hibernate Maven plugin on a build it must added to the model (pom.xml) along with other plugins that may be
already in use. The XML snippet below is an example of how to declare and configure the plugin.
[[maven-plugin-apply-example]]
.Apply the plugin
====
[source, XML]
----
<build>
<plugins>
[...]
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>$currentHibernateVersion</version>
<executions>
<execution>
<configuration>
<failOnError>true</failOnError>
<enableLazyInitialization>true</enableLazyInitialization>
<enableDirtyTracking>true</enableDirtyTracking>
<enableAssociationManagement>true</enableAssociationManagement>
<enableExtendedEnhancement>false</enableExtendedEnhancement>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
[...]
</plugins>
</build>
----
====
=== Ant Task

View File

@ -1,95 +0,0 @@
[[logging-guide]]]]
= Logging Guide
:toc:
Since version 4.0, Hibernate has used the JBoss Logging library for its logging needs. Like SLF4J and
Jakarta's commons-logging, JBoss Logging is a "logging bridge" providing integration with numerous logging
frameworks. JBoss Logging was chosen because of its i18n support and its support for "message ids". This is largely
the seminal documentation of JBoss Logging since JBoss Logging currently provides no documentation of its own.
== Supported Back-ends
JBoss Logging understands the following back-ends as first-class citizens:
. JBoss LogManager (mainly used only inside the WildFly app server)
. Log4j 2
. Log4j 1
. Slf4j
. JDK logging
Note the order above, it is important. By default JBoss Logging will search the ClassLoader for the availability of
classes that indicate one of the above "providers" being available. It does this in the order defined above. So,
for example, if you have both JBoss LogManager and Slf4j available your classpath then JBoss LogManager will be used
as it has the "higher precedence".
NOTE: Slf4j will only be auto-selected if Logback is in use.
This can sometimes lead to an unwanted logging set up to be used. In such cases, JBoss Logging provides for you to
tell it specifically which provider to use and circumvent the discovery process just described. It allows 2 different
mechanisms for this:
. First, JBoss Logging will look for a *System* setting with the key `org.jboss.logging.provider`, which can be set to
one of the following values:
* jboss
* jdk
* log4j2
* log4j
* slf4j
. Next, JBoss Logging will look for a JDK service (see javadocs for +java.util.ServiceLoader+ for details) for its
"provider" contract (+org.jboss.logging.Provider+). If multiple are available, it will use the first one returned by
the ClassLoader.
== Usage
Most of the time, the discovery process JustWorks. The discovery process relies on the jars available on the classpath.
The jboss-logging jar is a required dependency of Hibernate and therefore will always need to be on the classpath.
* To use JBoss Logging with Log4j, the log4j jar would also need to be available on the classpath.
* To use JBoss Logging with Log4j2, the log4j2 jar would also need to be available on the classpath.
* To use JBoss Logging with Slf4j, the slf4j-api jar would also need to be available on the classpath *plus* any needed
slf4j backend.
JDK Logging would be used if none of the other framework jars are available.
== Log Categories of Interest
It is recommended that you familiarize yourself with the log messages sent from Hibernate. A lot of work has been put
into making the Hibernate logging as detailed as possible, without making it unreadable. It is an essential
troubleshooting device. Some log categories of particular interest include:
.Hibernate Log Categories of Interest
|===
|Category|Description
|org.hibernate.SQL
|Log all SQL statements as they are executed with through JDBC
|org.hibernate.type.descriptor.jdbc
|Log all values as they are bound to JDBC parameters and extracted from JDBC results
|org.hibernate.tool.hbm2ddl
|Log all SQL DDL statements as they are executed during execution of any of the schema migration tools
|org.hibernate.pretty
|Log the state of all entities (max 20 entities) associated with the session at flush time
|org.hibernate.cache
|Log all second-level cache activity
|org.hibernate.hql.internal.ast.AST
|Log HQL and SQL ASTs during query parsing
|org.hibernate
|Log everything. This is a lot of information but it is useful for troubleshooting
|===
== Message Id Index
Coming soon.