📄 settingsfactory.java
字号:
//$Id: SettingsFactory.java 11402 2007-04-11 14:24:35Z steve.ebersole@jboss.com $package org.hibernate.cfg;import java.io.Serializable;import java.lang.reflect.Method;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Map;import java.util.Properties;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.hibernate.ConnectionReleaseMode;import org.hibernate.EntityMode;import org.hibernate.HibernateException;import org.hibernate.bytecode.BytecodeProvider;import org.hibernate.cache.QueryCacheFactory;import org.hibernate.cache.RegionFactory;import org.hibernate.cache.impl.NoCachingRegionFactory;import org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge;import org.hibernate.connection.ConnectionProvider;import org.hibernate.connection.ConnectionProviderFactory;import org.hibernate.dialect.Dialect;import org.hibernate.dialect.DialectFactory;import org.hibernate.exception.SQLExceptionConverter;import org.hibernate.exception.SQLExceptionConverterFactory;import org.hibernate.hql.QueryTranslatorFactory;import org.hibernate.jdbc.BatcherFactory;import org.hibernate.jdbc.BatchingBatcherFactory;import org.hibernate.jdbc.NonBatchingBatcherFactory;import org.hibernate.jdbc.util.SQLStatementLogger;import org.hibernate.transaction.TransactionFactory;import org.hibernate.transaction.TransactionFactoryFactory;import org.hibernate.transaction.TransactionManagerLookup;import org.hibernate.transaction.TransactionManagerLookupFactory;import org.hibernate.util.PropertiesHelper;import org.hibernate.util.ReflectHelper;import org.hibernate.util.StringHelper;/** * Reads configuration properties and configures a <tt>Settings</tt> instance. * * @author Gavin King */public class SettingsFactory implements Serializable { public static final String DEF_CACHE_REG_FACTORY = NoCachingRegionFactory.class.getName(); private static final Logger log = LoggerFactory.getLogger(SettingsFactory.class); protected SettingsFactory() { } public Settings buildSettings(Properties props) { Settings settings = new Settings(); //SessionFactory name: String sessionFactoryName = props.getProperty(Environment.SESSION_FACTORY_NAME); settings.setSessionFactoryName(sessionFactoryName); //JDBC and connection settings: ConnectionProvider connections = createConnectionProvider(props); settings.setConnectionProvider(connections); //Interrogate JDBC metadata String databaseName = null; int databaseMajorVersion = 0; boolean metaSupportsScrollable = false; boolean metaSupportsGetGeneratedKeys = false; boolean metaSupportsBatchUpdates = false; boolean metaReportsDDLCausesTxnCommit = false; boolean metaReportsDDLInTxnSupported = true; // 'hibernate.temp.use_jdbc_metadata_defaults' is a temporary magic value. // The need for it is intended to be alleviated with 3.3 developement, thus it is // not defined as an Environment constant... // it is used to control whether we should consult the JDBC metadata to determine // certain Settings default values; it is useful to *not* do this when the database // may not be available (mainly in tools usage). boolean useJdbcMetadata = PropertiesHelper.getBoolean( "hibernate.temp.use_jdbc_metadata_defaults", props, true ); if ( useJdbcMetadata ) { try { Connection conn = connections.getConnection(); try { DatabaseMetaData meta = conn.getMetaData(); databaseName = meta.getDatabaseProductName(); databaseMajorVersion = getDatabaseMajorVersion(meta); log.info("RDBMS: " + databaseName + ", version: " + meta.getDatabaseProductVersion() ); log.info("JDBC driver: " + meta.getDriverName() + ", version: " + meta.getDriverVersion() ); metaSupportsScrollable = meta.supportsResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE); metaSupportsBatchUpdates = meta.supportsBatchUpdates(); metaReportsDDLCausesTxnCommit = meta.dataDefinitionCausesTransactionCommit(); metaReportsDDLInTxnSupported = !meta.dataDefinitionIgnoredInTransactions(); if ( Environment.jvmSupportsGetGeneratedKeys() ) { try { Boolean result = (Boolean) DatabaseMetaData.class.getMethod("supportsGetGeneratedKeys", null) .invoke(meta, null); metaSupportsGetGeneratedKeys = result.booleanValue(); } catch (AbstractMethodError ame) { metaSupportsGetGeneratedKeys = false; } catch (Exception e) { metaSupportsGetGeneratedKeys = false; } } } finally { connections.closeConnection(conn); } } catch (SQLException sqle) { log.warn("Could not obtain connection metadata", sqle); } catch (UnsupportedOperationException uoe) { // user supplied JDBC connections } } settings.setDataDefinitionImplicitCommit( metaReportsDDLCausesTxnCommit ); settings.setDataDefinitionInTransactionSupported( metaReportsDDLInTxnSupported ); //SQL Dialect: Dialect dialect = determineDialect( props, databaseName, databaseMajorVersion ); settings.setDialect(dialect); //use dialect default properties final Properties properties = new Properties(); properties.putAll( dialect.getDefaultProperties() ); properties.putAll(props); // Transaction settings: TransactionFactory transactionFactory = createTransactionFactory(properties); settings.setTransactionFactory(transactionFactory); settings.setTransactionManagerLookup( createTransactionManagerLookup(properties) ); boolean flushBeforeCompletion = PropertiesHelper.getBoolean(Environment.FLUSH_BEFORE_COMPLETION, properties); log.info("Automatic flush during beforeCompletion(): " + enabledDisabled(flushBeforeCompletion) ); settings.setFlushBeforeCompletionEnabled(flushBeforeCompletion); boolean autoCloseSession = PropertiesHelper.getBoolean(Environment.AUTO_CLOSE_SESSION, properties); log.info("Automatic session close at end of transaction: " + enabledDisabled(autoCloseSession) ); settings.setAutoCloseSessionEnabled(autoCloseSession); //JDBC and connection settings: int batchSize = PropertiesHelper.getInt(Environment.STATEMENT_BATCH_SIZE, properties, 0); if ( !metaSupportsBatchUpdates ) batchSize = 0; if (batchSize>0) log.info("JDBC batch size: " + batchSize); settings.setJdbcBatchSize(batchSize); boolean jdbcBatchVersionedData = PropertiesHelper.getBoolean(Environment.BATCH_VERSIONED_DATA, properties, false); if (batchSize>0) log.info("JDBC batch updates for versioned data: " + enabledDisabled(jdbcBatchVersionedData) ); settings.setJdbcBatchVersionedData(jdbcBatchVersionedData); settings.setBatcherFactory( createBatcherFactory(properties, batchSize) ); boolean useScrollableResultSets = PropertiesHelper.getBoolean(Environment.USE_SCROLLABLE_RESULTSET, properties, metaSupportsScrollable); log.info("Scrollable result sets: " + enabledDisabled(useScrollableResultSets) ); settings.setScrollableResultSetsEnabled(useScrollableResultSets); boolean wrapResultSets = PropertiesHelper.getBoolean(Environment.WRAP_RESULT_SETS, properties, false); log.debug( "Wrap result sets: " + enabledDisabled(wrapResultSets) ); settings.setWrapResultSetsEnabled(wrapResultSets); boolean useGetGeneratedKeys = PropertiesHelper.getBoolean(Environment.USE_GET_GENERATED_KEYS, properties, metaSupportsGetGeneratedKeys); log.info("JDBC3 getGeneratedKeys(): " + enabledDisabled(useGetGeneratedKeys) ); settings.setGetGeneratedKeysEnabled(useGetGeneratedKeys); Integer statementFetchSize = PropertiesHelper.getInteger(Environment.STATEMENT_FETCH_SIZE, properties); if (statementFetchSize!=null) log.info("JDBC result set fetch size: " + statementFetchSize); settings.setJdbcFetchSize(statementFetchSize); String releaseModeName = PropertiesHelper.getString( Environment.RELEASE_CONNECTIONS, properties, "auto" ); log.info( "Connection release mode: " + releaseModeName ); ConnectionReleaseMode releaseMode; if ( "auto".equals(releaseModeName) ) { releaseMode = transactionFactory.getDefaultReleaseMode(); } else { releaseMode = ConnectionReleaseMode.parse( releaseModeName ); if ( releaseMode == ConnectionReleaseMode.AFTER_STATEMENT && !connections.supportsAggressiveRelease() ) { log.warn( "Overriding release mode as connection provider does not support 'after_statement'" ); releaseMode = ConnectionReleaseMode.AFTER_TRANSACTION; } } settings.setConnectionReleaseMode( releaseMode ); //SQL Generation settings: String defaultSchema = properties.getProperty(Environment.DEFAULT_SCHEMA); String defaultCatalog = properties.getProperty(Environment.DEFAULT_CATALOG); if (defaultSchema!=null) log.info("Default schema: " + defaultSchema); if (defaultCatalog!=null) log.info("Default catalog: " + defaultCatalog); settings.setDefaultSchemaName(defaultSchema); settings.setDefaultCatalogName(defaultCatalog); Integer maxFetchDepth = PropertiesHelper.getInteger(Environment.MAX_FETCH_DEPTH, properties); if (maxFetchDepth!=null) log.info("Maximum outer join fetch depth: " + maxFetchDepth); settings.setMaximumFetchDepth(maxFetchDepth); int batchFetchSize = PropertiesHelper.getInt(Environment.DEFAULT_BATCH_FETCH_SIZE, properties, 1); log.info("Default batch fetch size: " + batchFetchSize); settings.setDefaultBatchFetchSize(batchFetchSize); boolean comments = PropertiesHelper.getBoolean(Environment.USE_SQL_COMMENTS, properties); log.info( "Generate SQL with comments: " + enabledDisabled(comments) ); settings.setCommentsEnabled(comments); boolean orderUpdates = PropertiesHelper.getBoolean(Environment.ORDER_UPDATES, properties); log.info( "Order SQL updates by primary key: " + enabledDisabled(orderUpdates) ); settings.setOrderUpdatesEnabled(orderUpdates); boolean orderInserts = PropertiesHelper.getBoolean(Environment.ORDER_INSERTS, properties); log.info( "Order SQL inserts for batching: " + enabledDisabled( orderInserts ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -