FileDocCategorySizeDatePackage
Environment.javaAPI DocHibernate 3.2.525046Tue Jul 31 11:52:44 BST 2007org.hibernate.cfg

Environment

public final class Environment extends Object
Provides access to configuration info passed in Properties objects.

Hibernate has two property scopes:
  • Factory-level properties may be passed to the SessionFactory when it instantiated. Each instance might have different property values. If no properties are specified, the factory calls Environment.getProperties().
  • System-level properties are shared by all factory instances and are always determined by the Environment properties.
The only system-level properties are
  • hibernate.jdbc.use_streams_for_binary
  • hibernate.cglib.use_reflection_optimizer
Environment properties are populated by calling System.getProperties() and then from a resource named /hibernate.properties if it exists. System properties override properties specified in hibernate.properties.

The SessionFactory is controlled by the following properties. Properties may be either be System properties, properties defined in a resource named /hibernate.properties or an instance of java.util.Properties passed to Configuration.buildSessionFactory()

propertymeaning
hibernate.dialect classname of org.hibernate.dialect.Dialect subclass
hibernate.cache.provider_class classname of org.hibernate.cache.CacheProvider subclass (if not specified EHCache is used)
hibernate.connection.provider_class classname of org.hibernate.connection.ConnectionProvider subclass (if not specified hueristics are used)
hibernate.connection.usernamedatabase username
hibernate.connection.passworddatabase password
hibernate.connection.url JDBC URL (when using java.sql.DriverManager)
hibernate.connection.driver_class classname of JDBC driver
hibernate.connection.isolation JDBC transaction isolation level (only when using java.sql.DriverManager)
hibernate.connection.pool_size the maximum size of the connection pool (only when using java.sql.DriverManager)
hibernate.connection.datasource databasource JNDI name (when using javax.sql.Datasource)
hibernate.jndi.urlJNDI InitialContext URL
hibernate.jndi.classJNDI InitialContext classname
hibernate.max_fetch_depth maximum depth of outer join fetching
hibernate.jdbc.batch_size enable use of JDBC2 batch API for drivers which support it
hibernate.jdbc.fetch_size set the JDBC fetch size
hibernate.jdbc.use_scrollable_resultset enable use of JDBC2 scrollable resultsets (you only need this specify this property when using user supplied connections)
hibernate.jdbc.use_getGeneratedKeys enable use of JDBC3 PreparedStatement.getGeneratedKeys() to retrieve natively generated keys after insert. Requires JDBC3+ driver and JRE1.4+
hibernate.hbm2ddl.auto enable auto DDL export
hibernate.default_schema use given schema name for unqualified tables (always optional)
hibernate.default_catalog use given catalog name for unqualified tables (always optional)
hibernate.session_factory_name If set, the factory attempts to bind this name to itself in the JNDI context. This name is also used to support cross JVM Session (de)serialization.
hibernate.transaction.manager_lookup_class classname of org.hibernate.transaction.TransactionManagerLookup implementor
hibernate.transaction.factory_class the factory to use for instantiating Transactions. (Defaults to JDBCTransactionFactory.)
hibernate.query.substitutionsquery language token substitutions
see
org.hibernate.SessionFactory
author
Gavin King

Fields Summary
public static final String
VERSION
public static final String
CONNECTION_PROVIDER
ConnectionProvider implementor to use when obtaining connections
public static final String
DRIVER
JDBC driver class
public static final String
ISOLATION
JDBC transaction isolation level
public static final String
URL
JDBC URL
public static final String
USER
JDBC user
public static final String
PASS
JDBC password
public static final String
AUTOCOMMIT
JDBC autocommit mode
public static final String
POOL_SIZE
Maximum number of inactive connections for Hibernate's connection pool
public static final String
DATASOURCE
java.sql.Datasource JNDI name
public static final String
CONNECTION_PREFIX
prefix for arbitrary JDBC connection properties
public static final String
JNDI_CLASS
JNDI initial context class, Context.INITIAL_CONTEXT_FACTORY
public static final String
JNDI_URL
JNDI provider URL, Context.PROVIDER_URL
public static final String
JNDI_PREFIX
prefix for arbitrary JNDI InitialContext properties
public static final String
SESSION_FACTORY_NAME
JNDI name to bind to SessionFactory
public static final String
DIALECT
Hibernate SQL Dialect class
public static final String
DEFAULT_SCHEMA
A default database schema (owner) name to use for unqualified tablenames
public static final String
DEFAULT_CATALOG
A default database catalog name to use for unqualified tablenames
public static final String
SHOW_SQL
Enable logging of generated SQL to the console
public static final String
FORMAT_SQL
Enable formatting of SQL logged to the console
public static final String
USE_SQL_COMMENTS
Add comments to the generated SQL
public static final String
MAX_FETCH_DEPTH
Maximum depth of outer join fetching
public static final String
DEFAULT_BATCH_FETCH_SIZE
The default batch size for batch fetching
public static final String
USE_STREAMS_FOR_BINARY
Use java.io streams to read / write binary data from / to JDBC
public static final String
USE_SCROLLABLE_RESULTSET
Use JDBC scrollable ResultSets. This property is only necessary when there is no ConnectionProvider, ie. the user is supplying JDBC connections.
public static final String
USE_GET_GENERATED_KEYS
Tells the JDBC driver to attempt to retrieve row Id with the JDBC 3.0 PreparedStatement.getGeneratedKeys() method. In general, performance will be better if this property is set to true and the underlying JDBC driver supports getGeneratedKeys().
public static final String
STATEMENT_FETCH_SIZE
Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed. If 0, JDBC driver default settings will be used.
public static final String
STATEMENT_BATCH_SIZE
Maximum JDBC batch size. A nonzero value enables batch updates.
public static final String
BATCH_STRATEGY
Select a custom batcher.
public static final String
BATCH_VERSIONED_DATA
Should versioned data be included in batching?
public static final String
OUTPUT_STYLESHEET
An XSLT resource used to generate "custom" XML
public static final String
C3P0_MAX_SIZE
Maximum size of C3P0 connection pool
public static final String
C3P0_MIN_SIZE
Minimum size of C3P0 connection pool
public static final String
C3P0_TIMEOUT
Maximum idle time for C3P0 connection pool
public static final String
C3P0_MAX_STATEMENTS
Maximum size of C3P0 statement cache
public static final String
C3P0_ACQUIRE_INCREMENT
Number of connections acquired when pool is exhausted
public static final String
C3P0_IDLE_TEST_PERIOD
Idle time before a C3P0 pooled connection is validated
public static final String
PROXOOL_PREFIX
Proxool/Hibernate property prefix
public static final String
PROXOOL_XML
Proxool property to configure the Proxool Provider using an XML (/path/to/file.xml)
public static final String
PROXOOL_PROPERTIES
Proxool property to configure the Proxool Provider using a properties file (/path/to/proxool.properties)
public static final String
PROXOOL_EXISTING_POOL
Proxool property to configure the Proxool Provider from an already existing pool (true / false)
public static final String
PROXOOL_POOL_ALIAS
Proxool property with the Proxool pool alias to use (Required for PROXOOL_EXISTING_POOL, PROXOOL_PROPERTIES, or PROXOOL_XML)
public static final String
AUTO_CLOSE_SESSION
Enable automatic session close at end of transaction
public static final String
FLUSH_BEFORE_COMPLETION
Enable automatic flush during the JTA beforeCompletion() callback
public static final String
RELEASE_CONNECTIONS
Specifies how Hibernate should release JDBC connections.
public static final String
CURRENT_SESSION_CONTEXT_CLASS
Context scoping impl for {@link org.hibernate.SessionFactory#getCurrentSession()} processing.
public static final String
TRANSACTION_STRATEGY
TransactionFactory implementor to use for creating Transactions
public static final String
TRANSACTION_MANAGER_STRATEGY
TransactionManagerLookup implementor to use for obtaining the TransactionManager
public static final String
USER_TRANSACTION
JNDI name of JTA UserTransaction object
public static final String
CACHE_PROVIDER
The CacheProvider implementation class
public static final String
CACHE_PROVIDER_CONFIG
The CacheProvider implementation class
public static final String
CACHE_NAMESPACE
The CacheProvider JNDI namespace, if pre-bound to JNDI.
public static final String
USE_QUERY_CACHE
Enable the query cache (disabled by default)
public static final String
QUERY_CACHE_FACTORY
The QueryCacheFactory implementation class.
public static final String
USE_SECOND_LEVEL_CACHE
Enable the second-level cache (enabled by default)
public static final String
USE_MINIMAL_PUTS
Optimize the cache for mimimal puts instead of minimal gets
public static final String
CACHE_REGION_PREFIX
The CacheProvider region name prefix
public static final String
USE_STRUCTURED_CACHE
Enable use of structured second-level cache entries
public static final String
GENERATE_STATISTICS
Enable statistics collection
public static final String
USE_IDENTIFIER_ROLLBACK
public static final String
USE_REFLECTION_OPTIMIZER
Use bytecode libraries optimized property access
public static final String
QUERY_TRANSLATOR
The classname of the HQL query parser factory
public static final String
QUERY_SUBSTITUTIONS
A comma-seperated list of token substitutions to use when translating a Hibernate query to SQL
public static final String
QUERY_STARTUP_CHECKING
Should named queries be checked during startup (the default is enabled).

Mainly intended for test environments.

public static final String
HBM2DDL_AUTO
Auto export/update schema using hbm2ddl tool. Valid values are update, create, create-drop and validate.
public static final String
SQL_EXCEPTION_CONVERTER
The {@link org.hibernate.exception.SQLExceptionConverter} to use for converting SQLExceptions to Hibernate's JDBCException hierarchy. The default is to use the configured {@link org.hibernate.dialect.Dialect}'s preferred SQLExceptionConverter.
public static final String
WRAP_RESULT_SETS
Enable wrapping of JDBC result sets in order to speed up column name lookups for broken JDBC drivers
public static final String
ORDER_UPDATES
Enable ordering of update statements by primary key value
public static final String
ORDER_INSERTS
Enable ordering of insert statements for the purpose of more effecient JDBC batching.
public static final String
DEFAULT_ENTITY_MODE
The EntityMode in which set the Session opened from the SessionFactory.
public static final String
JACC_CONTEXTID
The jacc context id of the deployment
public static final String
BYTECODE_PROVIDER
public static final String
JPAQL_STRICT_COMPLIANCE
private static final org.hibernate.bytecode.BytecodeProvider
BYTECODE_PROVIDER_INSTANCE
private static final boolean
ENABLE_BINARY_STREAMS
private static final boolean
ENABLE_REFLECTION_OPTIMIZER
private static final boolean
JVM_SUPPORTS_LINKED_HASH_COLLECTIONS
private static final boolean
JVM_HAS_TIMESTAMP_BUG
private static final boolean
JVM_HAS_JDK14_TIMESTAMP
private static final boolean
JVM_SUPPORTS_GET_GENERATED_KEYS
private static final Properties
GLOBAL_PROPERTIES
private static final HashMap
ISOLATION_LEVELS
private static final Map
OBSOLETE_PROPERTIES
private static final Map
RENAMED_PROPERTIES
private static final Log
log
Constructors Summary
private Environment()

 throw new UnsupportedOperationException(); 
Methods Summary
public static org.hibernate.bytecode.BytecodeProviderbuildBytecodeProvider(java.util.Properties properties)

		String provider = PropertiesHelper.getString( Environment.BYTECODE_PROVIDER, properties, "cglib" );
		log.info( "Bytecode provider name : " + provider );
		return buildBytecodeProvider( provider );
	
private static org.hibernate.bytecode.BytecodeProviderbuildBytecodeProvider(java.lang.String providerName)

		if ( "javassist".equals( providerName ) ) {
			return new org.hibernate.bytecode.javassist.BytecodeProviderImpl();
		}
		else if ( "cglib".equals( providerName ) ) {
			return new org.hibernate.bytecode.cglib.BytecodeProviderImpl();
		}
		else {
			log.warn( "unrecognized bytecode provider [" + providerName + "], using cglib by default" );
			return new org.hibernate.bytecode.cglib.BytecodeProviderImpl();
		}
	
public static org.hibernate.bytecode.BytecodeProvidergetBytecodeProvider()


		log.info("Hibernate " + VERSION);

		RENAMED_PROPERTIES.put( "hibernate.cglib.use_reflection_optimizer", USE_REFLECTION_OPTIMIZER );

		ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_NONE), "NONE" );
		ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_READ_UNCOMMITTED), "READ_UNCOMMITTED" );
		ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_READ_COMMITTED), "READ_COMMITTED" );
		ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_REPEATABLE_READ), "REPEATABLE_READ" );
		ISOLATION_LEVELS.put( new Integer(Connection.TRANSACTION_SERIALIZABLE), "SERIALIZABLE" );

		GLOBAL_PROPERTIES = new Properties();
		//Set USE_REFLECTION_OPTIMIZER to false to fix HHH-227
		GLOBAL_PROPERTIES.setProperty( USE_REFLECTION_OPTIMIZER, Boolean.FALSE.toString() );

		try {
			InputStream stream = ConfigHelper.getResourceAsStream("/hibernate.properties");
			try {
				GLOBAL_PROPERTIES.load(stream);
				log.info( "loaded properties from resource hibernate.properties: " + PropertiesHelper.maskOut(GLOBAL_PROPERTIES, PASS) );
			}
			catch (Exception e) {
				log.error("problem loading properties from hibernate.properties");
			}
			finally {
				try{
					stream.close();
				}
				catch (IOException ioe){
					log.error("could not close stream on hibernate.properties", ioe);
				}
			}
		}
		catch (HibernateException he) {
			log.info("hibernate.properties not found");
		}

		try {
			GLOBAL_PROPERTIES.putAll( System.getProperties() );
		}
		catch (SecurityException se) {
			log.warn("could not copy system properties, system properties will be ignored");
		}

		verifyProperties(GLOBAL_PROPERTIES);

		ENABLE_BINARY_STREAMS = PropertiesHelper.getBoolean(USE_STREAMS_FOR_BINARY, GLOBAL_PROPERTIES);
		ENABLE_REFLECTION_OPTIMIZER = PropertiesHelper.getBoolean(USE_REFLECTION_OPTIMIZER, GLOBAL_PROPERTIES);

		if (ENABLE_BINARY_STREAMS) {
			log.info("using java.io streams to persist binary types");
		}
		if (ENABLE_REFLECTION_OPTIMIZER) {
			log.info("using bytecode reflection optimizer");
		}
		BYTECODE_PROVIDER_INSTANCE = buildBytecodeProvider( GLOBAL_PROPERTIES );

		boolean getGeneratedKeysSupport;
		try {
			Statement.class.getMethod("getGeneratedKeys", null);
			getGeneratedKeysSupport = true;
		}
		catch (NoSuchMethodException nsme) {
			getGeneratedKeysSupport = false;
		}
		JVM_SUPPORTS_GET_GENERATED_KEYS = getGeneratedKeysSupport;
		if (!JVM_SUPPORTS_GET_GENERATED_KEYS) log.info("JVM does not support Statement.getGeneratedKeys()");

		boolean linkedHashSupport;
		try {
			Class.forName("java.util.LinkedHashSet");
			linkedHashSupport = true;
		}
		catch (ClassNotFoundException cnfe) {
			linkedHashSupport = false;
		}
		JVM_SUPPORTS_LINKED_HASH_COLLECTIONS = linkedHashSupport;
		if (!JVM_SUPPORTS_LINKED_HASH_COLLECTIONS) log.info("JVM does not support LinkedHasMap, LinkedHashSet - ordered maps and sets disabled");

		JVM_HAS_TIMESTAMP_BUG = new Timestamp(123456789).getTime() != 123456789;
		if (JVM_HAS_TIMESTAMP_BUG) log.info("using workaround for JVM bug in java.sql.Timestamp");
		Timestamp t = new Timestamp(0);
		t.setNanos(5 * 1000000);
		JVM_HAS_JDK14_TIMESTAMP = t.getTime() == 5;
		if (JVM_HAS_JDK14_TIMESTAMP) {
			log.info("using JDK 1.4 java.sql.Timestamp handling");
		}
		else {
			log.info("using pre JDK 1.4 java.sql.Timestamp handling");
		}
	
		return BYTECODE_PROVIDER_INSTANCE;
	
public static java.util.PropertiesgetProperties()
Return System properties, extended by any properties specified in hibernate.properties.

return
Properties

		Properties copy = new Properties();
		copy.putAll(GLOBAL_PROPERTIES);
		return copy;
	
public static java.lang.StringisolationLevelToString(int isolation)
Get the name of a JDBC transaction isolation level

see
java.sql.Connection
param
isolation as defined by java.sql.Connection
return
a human-readable name

		return (String) ISOLATION_LEVELS.get( new Integer(isolation) );
	
public static booleanjvmHasJDK14Timestamp()
Does this JVM handle Timestamp in the JDK 1.4 compliant way?

		return JVM_HAS_JDK14_TIMESTAMP;
	
public static booleanjvmHasTimestampBug()
Does this JVM have the IBM JDK 1.3.1. The bug is new Timestamp(x).getTime()!=x.

		return JVM_HAS_TIMESTAMP_BUG;
	
public static booleanjvmSupportsGetGeneratedKeys()

		return JVM_SUPPORTS_GET_GENERATED_KEYS;
	
public static booleanjvmSupportsLinkedHashCollections()
Does this JVM support LinkedHashSet, LinkedHashMap.

see
java.util.LinkedHashSet
see
java.util.LinkedHashMap

		return JVM_SUPPORTS_LINKED_HASH_COLLECTIONS;
	
public static booleanuseReflectionOptimizer()
Should we use CGLIB reflection optimizer. Property hibernate.jdbc.use_refection_optimizer.

see
Environment#USE_REFLECTION_OPTIMIZER

		return ENABLE_REFLECTION_OPTIMIZER;
	
public static booleanuseStreamsForBinary()
Should we use streams to bind binary types to JDBC IN parameters. Property hibernate.jdbc.use_streams_for_binary.

see
Environment#USE_STREAMS_FOR_BINARY

		return ENABLE_BINARY_STREAMS;
	
public static voidverifyProperties(java.util.Properties props)
Issues warnings to the user when any obsolete property names are used.


	            	 
	     
		Iterator iter = props.keySet().iterator();
		Map propertiesToAdd = new HashMap();
		while ( iter.hasNext() ) {
			final Object propertyName = iter.next();
			Object newPropertyName = OBSOLETE_PROPERTIES.get( propertyName );
			if ( newPropertyName != null ) {
				log.warn( "Usage of obsolete property: " + propertyName + " no longer supported, use: " + newPropertyName );
			}
			newPropertyName = RENAMED_PROPERTIES.get( propertyName );
			if ( newPropertyName != null ) {
				log.warn( "Property [" + propertyName + "] has been renamed to [" + newPropertyName + "]; update your properties appropriately" );
				if ( ! props.containsKey( newPropertyName ) ) {
					propertiesToAdd.put( newPropertyName, props.get( propertyName ) );
				}
			}
		}
		props.putAll(propertiesToAdd);