SessionFactory Configuration
Because Hibernate is designed to operate in many different environments, there
are a large number of configuration parameters. Fortunately, most have sensible
default values and Hibernate is distributed with an example
hibernate.properties file that shows the various options.
You usually only have to put that file in your classpath and customize it.
Programmatic Configuration
An instance of net.sf.hibernate.cfg.Configuration
represents an entire set of mappings of an application's Java types to a
SQL database. The Configuration is used to build a
(immutable)` SessionFactory. The mappings are compiled
from various XML mapping files.
You may obtain a Configuration instance by
instantiating it directly. Heres an example of setting up a datastore from
mappings defined in two XML configuration files (in the classpath):
An alternative (sometimes better) way is to let Hibernate load a mapping file
using getResourceAsStream():
Then Hibernate will look for mapping files named
/org/hibernate/autcion/Item.hbm.xml and
/org/hibernate/autcion/Bid.hbm.xml in the classpath.
This approach eliminates any hardcoded filenames.
A Configuration also specifies various optional properties:
A Configuration is intended as a configuration-time object, to be
discarded once a SessionFactory is built.
Obtaining a SessionFactory
When all mappings have been parsed by the Configuration, the application
must obtain a factory for Session instances. This factory is intended
to be shared by all application threads:
However, Hibernate does allow your application to instantiate more than one
SessionFactory. This is useful if you are using more than one database.
User provided JDBC connection
A SessionFactory may open a Session on
a user-provided JDBC connection. This design choice frees the application to
obtain JDBC connections wherever it pleases:
The application must be careful not to open two concurrent
Sessions on the same JDBC connection!
Hibernate provided JDBC connection
Alternatively, you can have the SessionFactory
open connections for you. The SessionFactory
must be provided with JDBC connection properties in one of the
following ways:
Pass an instance of java.util.Properties to
Configuration.setProperties().
Place hibernate.properties in a root directory of
the classpath.
Set System properties using
java -Dproperty=value.
Include <property> elements in
hibernate.cfg.xml (discussed later).
If you take this approach, opening a Session is as simple as:
All Hibernate property names and semantics are defined on the class
net.sf.hibernate.cfg.Environment. We will now describe the most
important settings for JDBC connection configuration.
Hibernate will obtain (and pool) connections using java.sql.DriverManager
if you set the following properties:
Hibernate JDBC Properties
Property name
Purpose
hibernate.connection.driver_class
jdbc driver class
hibernate.connection.url
jdbc URL
hibernate.connection.username
database user
hibernate.connection.password
database user password
hibernate.connection.pool_size
maximum number of pooled connections
Hibernate's own connection pooling algorithm is quite rudimentary. It is intended
to help you get started and is not intended for use in a production system
or even for performance testing. Use a third party pool for best performance and stability,
i.e., replace the hibernate.connection.pool_size property with
connection pool specific settings.
C3P0 is an open source JDBC connection pool distributed along with
Hibernate in the lib directory. Hibernate will use the built-in
C3P0ConnectionProvider for connection pooling if you set
the hibernate.c3p0.* properties.
There is also built-in support for Apache DBCP and for Proxool. You must set the
properties hibernate.dbcp.* (DBCP connection pool properties)
to enable the DBCPConnectionProvider. Prepared statement caching is
enabled (highly recommend) if hibernate.dbcp.ps.*
(DBCP statement cache properties) are set. Please refer the the Apache commons-pool
documentation for the interpretation of these properties. You should set the
hibernate.proxool.* properties if you wish to use Proxool.
This is an example using C3P0:
For use inside an application server, Hibernate may obtain connections from a
javax.sql.Datasource registered in JNDI. Set the following
properties:
Hibernate Datasource Properties
Propery name
Purpose
hibernate.connection.datasource
datasource JNDI name
hibernate.jndi.url
URL of the JNDI provider (optional)
hibernate.jndi.class
class of the JNDI InitialContextFactory (optional)
hibernate.connection.username
database user (optional)
hibernate.connection.password
database user password (optional)
This is an example using an application server provided JNDI datasource:
JDBC connections obtained from a JNDI datasource will automatically participate
in the container-managed transactions of the application server.
Arbitrary connection properties may be given by prepending
"hibernate.connnection" to the property name. For example, you
may specify a charSet using hibernate.connnection.charSet.
You may define your own plugin strategy for obtaining JDBC connections by implementing the
interface net.sf.hibernate.connection.ConnectionProvider. You may select
a custom implementation by setting hibernate.connection.provider_class.
Optional configuration properties
There are a number of other properties that control the behaviour of Hibernate
at runtime. All are optional and have reasonable default values.
System-level properties can only be set via java -Dproperty=value or
be defined in hibernate.properties and not with an instance of
Properties passed to the Configuration.
Hibernate Configuration Properties
Property name
Purpose
hibernate.dialect
The classname of a Hibernate Dialect - enables
certain platform dependent features.
eg.
full.classname.of.Dialect
hibernate.default_schema
Qualify unqualified tablenames with the given schema/tablespace
in generated SQL.
eg.
SCHEMA_NAME
hibernate.session_factory_name
The SessionFactory will be automatically
bound to this name in JNDI after it has been created.
eg.
jndi/composite/name
hibernate.use_outer_join
Enables outer join fetching. Deprecated, use max_fetch_depth.
eg.
true | false
hibernate.max_fetch_depth
Set a maximum "depth" for the outer join fetch tree
for single-ended associations (one-to-one, many-to-one).
A 0 disables default outer join fetching.
eg.
recommended values between 0 and 3
hibernate.jdbc.fetch_size
A non-zero value determines the JDBC fetch size (calls
Statement.setFetchSize()).
hibernate.jdbc.batch_size
A non-zero value enables use of JDBC2 batch updates by Hibernate.
eg.
recommended values between 5 and 30
hibernate.jdbc.use_scrollable_resultset
Enables use of JDBC2 scrollable resultsets by Hibernate.
This property is only necessary when using user supplied
JDBC connections, Hibernate uses connection metadata otherwise.
eg.
true | false
hibernate.jdbc.use_streams_for_binary
Use streams when writing/reading binary
or serializable types to/from JDBC
(system-level property).
eg.
true | false
hibernate.jdbc.use_get_generated_keys
Enable use of JDBC3 PreparedStatement.getGeneratedKeys()
to retrieve natively generated keys after insert. Requires JDBC3+ driver
and JRE1.4+, set to false if your driver has problems with the Hibernate
identifier generators. By default, tries to determine the driver capabilites
using connection metadata.
eg.
true|false
hibernate.cglib.use_reflection_optimizer
Enables use of CGLIB instead of runtime reflection (System-level
property, default is to use CGLIB where possible). Reflection
can sometimes be useful when troubleshooting.
eg.
true | false
hibernate.jndi.<propertyName>
Pass the property propertyName to
the JNDI InitialContextFactory.
hibernate.connection.isolation
Set the JDBC transaction isolation level. Check
java.sql.Connection for meaningful values but
note that most databases do not support all isolation levels.
eg.
1, 2, 4, 8
hibernate.connection.<propertyName>
Pass the JDBC property propertyName
to DriverManager.getConnection().
hibernate.connection.provider_class
The classname of a custom ConnectionProvider.
eg.
classname.of.ConnectionProvider
hibernate.cache.provider_class
The classname of a custom CacheProvider.
eg.
classname.of.CacheProvider
hibernate.cache.use_minimal_puts
Optimize second-level cache operation to minimize writes, at the
cost of more frequent reads (useful for clustered caches).
eg.
true|false
hibernate.cache.use_query_cache
Enable the query cache, individual queries still have to be set cachable.
eg.
true|false
hibernate.cache.region_prefix
A prefix to use for second-level cache region names.
eg.
prefix
hibernate.transaction.factory_class
The classname of a TransactionFactory
to use with Hibernate Transaction API
(defaults to JDBCTransactionFactory).
eg.
classname.of.TransactionFactory
jta.UserTransaction
A JNDI name used by JTATransactionFactory to
obtain the JTA UserTransaction from the
application server.
eg.
jndi/composite/name
hibernate.transaction.manager_lookup_class
The classname of a TransactionManagerLookup
- required when JVM-level caching is enabled in a JTA environment.
eg.
classname.of.TransactionManagerLookup
hibernate.query.substitutions
Mapping from tokens in Hibernate queries to SQL tokens
(tokens might be function or literal names, for example).
eg.
hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
hibernate.show_sql
Write all SQL statements to console.
eg.
true | false
hibernate.hbm2ddl.auto
Automatically export schema DDL to the database when the
SessionFactory is created. With
create-drop, the database schema
will be dropped when the SessionFactory
is closed explicitely.
eg.
update | create | create-drop
SQL Dialects
You should always set the hibernate.dialect property to the correct
net.sf.hibernate.dialect.Dialect subclass for your database. This is not
strictly essential unless you wish to use native or
sequence primary key generation or pessimistic locking (with, eg.
Session.lock() or Query.setLockMode()).
However, if you specify a dialect, Hibernate will use sensible defaults for some of the
other properties listed above, saving you the effort of specifying them manually.
Hibernate SQL Dialects (hibernate.dialect)
RDBMS
Dialect
DB2 net.sf.hibernate.dialect.DB2Dialect
MySQL net.sf.hibernate.dialect.MySQLDialect
SAP DB net.sf.hibernate.dialect.SAPDBDialect
Oracle (any version) net.sf.hibernate.dialect.OracleDialect
Oracle 9 net.sf.hibernate.dialect.Oracle9Dialect
Sybase net.sf.hibernate.dialect.SybaseDialect
Sybase Anywhere net.sf.hibernate.dialect.SybaseAnywhereDialect
Progress net.sf.hibernate.dialect.ProgressDialect
Mckoi SQL net.sf.hibernate.dialect.MckoiDialect
Interbase net.sf.hibernate.dialect.InterbaseDialect
Pointbase net.sf.hibernate.dialect.PointbaseDialect
PostgreSQL net.sf.hibernate.dialect.PostgreSQLDialect
HypersonicSQL net.sf.hibernate.dialect.HSQLDialect
Microsoft SQL Server net.sf.hibernate.dialect.SQLServerDialect
Ingres net.sf.hibernate.dialect.IngresDialect
Informix net.sf.hibernate.dialect.InformixDialect
FrontBase net.sf.hibernate.dialect.FrontbaseDialect
Outer Join Fetching
If your database supports ANSI or Oracle style outer joins, outer join
fetching might increase performance by limiting the number of round
trips to and from the database (at the cost of possibly more work performed by
the database itself). Outer join fetching allows a graph of objects connected
by many-to-one, one-to-many or one-to-one associations to be retrieved in a single
SQL SELECT.
By default, the fetched graph when loading an objects ends at leaf objects,
collections, objects with proxies, or where circularities occur.
For a particular association, fetching may be enabled
or disabled (and the default behaviour overridden) by setting the
outer-join attribute in the XML mapping.
Outer join fetching may be disabled globally by setting
the property hibernate.max_fetch_depth to 0.
A setting of 1 or higher enables outer join fetching for
all one-to-one and many-to-one associations, which are, also by default, set
to auto outer join. However, one-to-many associations and
collections are never fetched with an outer-join, unless explicitely declared
for each particular association. This behavior can also be overriden at runtime
with Hibernate queries.
Binary Streams
Oracle limits the size of byte arrays that may
be passed to/from its JDBC driver. If you wish to use large instances of
binary or serializable type, you should
enable hibernate.jdbc.use_streams_for_binary.
This is a JVM-level setting only.
Custom CacheProvider
You may integrate a JVM-level (or clustered) second-level cache system by
implementing the interface net.sf.hibernate.cache.CacheProvider.
You may select the custom implementation by setting
hibernate.cache.provider_class.
Transaction strategy configuration
If you wish to use the Hibernate Transaction API, you must
specify a factory class for Transaction instances by
setting the property hibernate.transaction.factory_class.
The Transaction API hides the underlying transaction
mechanism and allows Hibernate code to run in managed and non-managed environments.
There are two standard (built-in) choices:
net.sf.hibernate.transaction.JDBCTransactionFactory
delegates to database (JDBC) transactions (default)
net.sf.hibernate.transaction.JTATransactionFactory
delegates to JTA (if an existing transaction is underway, the Session
performs its work in that context, otherwise a new transaction is started)
You may also define your own transaction strategies (for a CORBA transaction service,
for example).
If you wish to use JVM-level caching of mutable data in a JTA environment, you must specify
a strategy for obtaining the JTA TransactionManager, as this is
not standardized for J2EE containers:
JTA TransactionManagers
Transaction Factory
Application Server
org.hibernate.transaction.JBossTransactionManagerLookup
JBoss
org.hibernate.transaction.WeblogicTransactionManagerLookup
Weblogic
org.hibernate.transaction.WebSphereTransactionManagerLookup
WebSphere
org.hibernate.transaction.OrionTransactionManagerLookup
Orion
org.hibernate.transaction.ResinTransactionManagerLookup
Resin
org.hibernate.transaction.JOTMTransactionManagerLookup
JOTM
org.hibernate.transaction.JOnASTransactionManagerLookup
JOnAS
org.hibernate.transaction.JRun4TransactionManagerLookup
JRun4
org.hibernate.transaction.BESTransactionManagerLookup
Borland ES
JNDI-bound SessionFactory
A JNDI bound Hibernate SessionFactory can simplify the lookup
of the factory and the creation of new Sessions.
If you wish to have the SessionFactory bound to a JNDI namespace, specify
a name (eg. java:comp/env/hibernate/SessionFactory) using the property
hibernate.session_factory_name. If this property is omitted, the
SessionFactory will not be bound to JNDI. (This is especially useful in
environments with a read-only JNDI default implementation, eg. Tomcat.)
When binding the SessionFactory to JNDI, Hibernate will use the values of
hibernate.jndi.url, hibernate.jndi.class to instantiate
an initial context. If they are not specified, the default InitialContext
will be used.
If you do choose to use JNDI, an EJB or other utility class may obtain the
SessionFactory using a JNDI lookup.
Query Language Substitution
You may define new Hibernate query tokens using hibernate.query.substitutions.
For example:
hibernate.query.substitutions true=1, false=0
would cause the tokens true and false to be translated to
integer literals in the generated SQL.
hibernate.query.substitutions toLowercase=LOWER
would allow you to rename the SQL LOWER function.
Logging
Hibernate logs various events using Apache commons-logging.
The commons-logging service will direct output to either Apache Log4j
(if you include log4j.jar in your classpath) or
JDK1.4 logging (if running under JDK1.4 or above). You may download
Log4j from http://jakarta.apache.org.
To use Log4j you will need to place a log4j.properties
file in your classpath, an example properties file is distributed with
Hibernate in the src/ directory.
We strongly recommend that you familiarize yourself with Hibernate's log
messages. A lot of work has been put into making the Hibernate log as
detailed as possible, without making it unreadable. It is an essential
troubleshooting device. Also don't forget to enable SQL logging as
described above (hibernate.show_sql), it is your first
step when looking for performance problems.
Implementing a NamingStrategy
The interface net.sf.hibernate.cfg.NamingStrategy allows you
to specify a "naming standard" for database objects and schema elements.
You may provide rules for automatically generating database identifiers from
Java identifiers or for processing "logical" column and table names given in
the mapping file into "physical" table and column names. This feature helps
reduce the verbosity of the mapping document, eliminating repetitive noise
(TBL_ prefixes, for example). The default strategy used by
Hibernate is quite minimal.
You may specify a different strategy by calling
Configuration.setNamingStrategy() before adding mappings:
net.sf.hibernate.cfg.ImprovedNamingStrategy is a built-in
strategy that might be a useful starting point for some applications.
XML Configuration File
An alternative approach is to specify a full configuration in a file named
hibernate.cfg.xml. This file can be used as a replacement
for the hibernate.properties file or, if both are present,
override properties.
The XML configuration file is by default expected to be in the root o
your CLASSPATH. Here is an example:
my/first/datasource
net.sf.hibernate.dialect.MySQLDialect
false
true
net.sf.hibernate.transaction.JTATransactionFactory
java:comp/UserTransaction
]]>
Configuring Hibernate is then as simple as
You can pick a different XML configuration file using