org.hibernate.cfg.Environment Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-core-jakarta Show documentation
Show all versions of hibernate-core-jakarta Show documentation
Hibernate O/RM implementation of the Jakarta Persistence specification
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or .
*/
package org.hibernate.cfg;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.Version;
import org.hibernate.bytecode.spi.BytecodeProvider;
import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.log.UnsupportedLogger;
import org.hibernate.internal.util.ConfigHelper;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.jboss.logging.Logger;
/**
* 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
* is 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.build()
*
*
* property meaning
*
* hibernate.dialect
* classname of org.hibernate.dialect.Dialect subclass
*
*
* hibernate.connection.provider_class
* classname of ConnectionProvider
* subclass (if not specified heuristics are used)
*
* hibernate.connection.username database username
* hibernate.connection.password database 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
* datasource JNDI name (when using javax.sql.Datasource)
*
*
* hibernate.jndi.url JNDI InitialContext URL
*
*
* hibernate.jndi.class JNDI 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 to 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.jta.platform
* classname of org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform
* implementor
*
*
* hibernate.transaction.factory_class
* the factory to use for instantiating Transactions.
* (Defaults to JdbcTransactionFactory.)
*
*
* hibernate.query.substitutions query language token substitutions
*
*
*
* @see org.hibernate.SessionFactory
* @author Gavin King
*/
public final class Environment implements AvailableSettings {
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, Environment.class.getName());
private static final BytecodeProvider BYTECODE_PROVIDER_INSTANCE;
private static final boolean ENABLE_BINARY_STREAMS;
private static final boolean ENABLE_REFLECTION_OPTIMIZER;
private static final boolean ENABLE_LEGACY_PROXY_CLASSNAMES;
private static final Properties GLOBAL_PROPERTIES;
/**
* No longer effective.
*
* @param configurationValues The specified properties.
* @deprecated without replacement. Such verification is best done ad hoc, case by case.
*/
@Deprecated
public static void verifyProperties(Map,?> configurationValues) {
//Obsolete and Renamed properties are no longer handled here
}
static {
Version.logVersion();
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.propertiesLoaded( ConfigurationHelper.maskOut( GLOBAL_PROPERTIES, PASS ) );
}
catch (Exception e) {
LOG.unableToLoadProperties();
}
finally {
try{
stream.close();
}
catch (IOException ioe){
LOG.unableToCloseStreamError( ioe );
}
}
}
catch (HibernateException he) {
LOG.propertiesNotFound();
}
try {
Properties systemProperties = System.getProperties();
// Must be thread-safe in case an application changes System properties during Hibernate initialization.
// See HHH-8383.
synchronized (systemProperties) {
GLOBAL_PROPERTIES.putAll(systemProperties);
}
}
catch (SecurityException se) {
LOG.unableToCopySystemProperties();
}
ENABLE_BINARY_STREAMS = ConfigurationHelper.getBoolean(USE_STREAMS_FOR_BINARY, GLOBAL_PROPERTIES);
if ( ENABLE_BINARY_STREAMS ) {
LOG.usingStreams();
}
ENABLE_REFLECTION_OPTIMIZER = ConfigurationHelper.getBoolean(USE_REFLECTION_OPTIMIZER, GLOBAL_PROPERTIES);
if ( ENABLE_REFLECTION_OPTIMIZER ) {
LOG.usingReflectionOptimizer();
}
ENABLE_LEGACY_PROXY_CLASSNAMES = ConfigurationHelper.getBoolean( ENFORCE_LEGACY_PROXY_CLASSNAMES, GLOBAL_PROPERTIES );
if ( ENABLE_LEGACY_PROXY_CLASSNAMES ) {
final UnsupportedLogger unsupportedLogger = Logger.getMessageLogger( UnsupportedLogger.class, Environment.class.getName() );
unsupportedLogger.usingLegacyClassnamesForProxies();
}
BYTECODE_PROVIDER_INSTANCE = buildBytecodeProvider( GLOBAL_PROPERTIES );
}
/**
* This will be removed soon; currently just returns false as no known JVM exhibits this bug
* and is also able to run this version of Hibernate ORM.
* @deprecated removed as unnecessary
* @return false
*/
@Deprecated
public static boolean jvmHasTimestampBug() {
return false;
}
/**
* Should we use streams to bind binary types to JDBC IN parameters?
*
* @return True if streams should be used for binary data handling; false otherwise.
*
* @see #USE_STREAMS_FOR_BINARY
*
* @deprecated Deprecated to indicate that the method will be moved to
* {@link org.hibernate.boot.spi.SessionFactoryOptions} /
* {@link org.hibernate.boot.SessionFactoryBuilder} - probably in 6.0.
* See HHH-12194 and
* HHH-12193 for details
*/
@Deprecated
public static boolean useStreamsForBinary() {
return ENABLE_BINARY_STREAMS;
}
/**
* Should we use reflection optimization?
*
* @return True if reflection optimization should be used; false otherwise.
*
* @see #USE_REFLECTION_OPTIMIZER
* @see #getBytecodeProvider()
* @see BytecodeProvider#getReflectionOptimizer
*
* @deprecated Deprecated to indicate that the method will be moved to
* {@link org.hibernate.boot.spi.SessionFactoryOptions} /
* {@link org.hibernate.boot.SessionFactoryBuilder} - probably in 6.0.
* See HHH-12194 and
* HHH-12193 for details
*/
@Deprecated
public static boolean useReflectionOptimizer() {
return ENABLE_REFLECTION_OPTIMIZER;
}
/**
* @deprecated Deprecated to indicate that the method will be moved to
* {@link org.hibernate.boot.spi.SessionFactoryOptions} /
* {@link org.hibernate.boot.SessionFactoryBuilder} - probably in 6.0.
* See HHH-12194 and
* HHH-12193 for details
*/
@Deprecated
public static BytecodeProvider getBytecodeProvider() {
return BYTECODE_PROVIDER_INSTANCE;
}
/**
* @return True if global option org.hibernate.cfg.AvailableSettings#ENFORCE_LEGACY_PROXY_CLASSNAMES was enabled
* @deprecated This option will be removed soon and should not be relied on.
*/
@Deprecated
public static boolean useLegacyProxyClassnames() {
return ENABLE_LEGACY_PROXY_CLASSNAMES;
}
/**
* Disallow instantiation
*/
private Environment() {
throw new UnsupportedOperationException();
}
/**
* Return System properties, extended by any properties specified
* in hibernate.properties.
* @return Properties
*/
public static Properties getProperties() {
Properties copy = new Properties();
copy.putAll(GLOBAL_PROPERTIES);
return copy;
}
/**
* @deprecated Use {@link ConnectionProviderInitiator#toIsolationNiceName} instead
*/
@Deprecated
public static String isolationLevelToString(int isolation) {
return ConnectionProviderInitiator.toIsolationNiceName( isolation );
}
public static final String BYTECODE_PROVIDER_NAME_JAVASSIST = "javassist";
public static final String BYTECODE_PROVIDER_NAME_BYTEBUDDY = "bytebuddy";
public static final String BYTECODE_PROVIDER_NAME_NONE = "none";
public static final String BYTECODE_PROVIDER_NAME_DEFAULT = BYTECODE_PROVIDER_NAME_BYTEBUDDY;
public static BytecodeProvider buildBytecodeProvider(Properties properties) {
String provider = ConfigurationHelper.getString( BYTECODE_PROVIDER, properties, BYTECODE_PROVIDER_NAME_DEFAULT );
return buildBytecodeProvider( provider );
}
private static BytecodeProvider buildBytecodeProvider(String providerName) {
if ( BYTECODE_PROVIDER_NAME_NONE.equals( providerName ) ) {
return new org.hibernate.bytecode.internal.none.BytecodeProviderImpl();
}
if ( BYTECODE_PROVIDER_NAME_BYTEBUDDY.equals( providerName ) ) {
return new org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl();
}
if ( BYTECODE_PROVIDER_NAME_JAVASSIST.equals( providerName ) ) {
throw LOG.usingRemovedJavassistBytecodeProvider();
}
LOG.bytecodeProvider( providerName );
// there is no need to support plugging in a custom BytecodeProvider via FQCN:
// - the static helper methods on this class are deprecated
// - it's possible to plug a custom BytecodeProvider directly into the ServiceRegistry
//
// This also allows integrators to inject a BytecodeProvider instance which has some
// state; particularly useful to inject proxy definitions which have been prepared in
// advance.
// See also https://hibernate.atlassian.net/browse/HHH-13804 and how this was solved in
// Quarkus.
LOG.unknownBytecodeProvider( providerName, BYTECODE_PROVIDER_NAME_DEFAULT );
return new org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl();
}
}