From: <hib...@li...> - 2006-06-06 17:23:30
|
Author: ste...@jb... Date: 2006-06-06 13:21:38 -0400 (Tue, 06 Jun 2006) New Revision: 9989 Modified: trunk/Hibernate3/src/org/hibernate/cfg/Environment.java trunk/Hibernate3/src/org/hibernate/cfg/Settings.java trunk/Hibernate3/src/org/hibernate/cfg/SettingsFactory.java trunk/Hibernate3/src/org/hibernate/hql/ast/exec/AbstractStatementExecutor.java trunk/Hibernate3/src/org/hibernate/hql/ast/tree/SelectClause.java trunk/Hibernate3/src/org/hibernate/hql/ast/util/SessionFactoryHelper.java Log: HHH-1817 : JPA-QL compliance setting Modified: trunk/Hibernate3/src/org/hibernate/cfg/Environment.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/Environment.java 2006-06-06 17:20:50 UTC (rev 9988) +++ trunk/Hibernate3/src/org/hibernate/cfg/Environment.java 2006-06-06 17:21:38 UTC (rev 9989) @@ -455,6 +455,7 @@ public static final String BYTECODE_PROVIDER = "hibernate.bytecode.provider"; + public static final String JPAQL_STRICT_COMPLIANCE= "hibernate.query.jpaql_strict_compliance"; private static final BytecodeProvider BYTECODE_PROVIDER_INSTANCE; private static final boolean ENABLE_BINARY_STREAMS; Modified: trunk/Hibernate3/src/org/hibernate/cfg/Settings.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/Settings.java 2006-06-06 17:20:50 UTC (rev 9988) +++ trunk/Hibernate3/src/org/hibernate/cfg/Settings.java 2006-06-06 17:21:38 UTC (rev 9989) @@ -14,7 +14,6 @@ import org.hibernate.exception.SQLExceptionConverter; import org.hibernate.EntityMode; import org.hibernate.ConnectionReleaseMode; -import org.hibernate.bytecode.BytecodeProvider; /** * Settings that affect the behaviour of Hibernate at runtime. @@ -63,17 +62,26 @@ private boolean wrapResultSetsEnabled; private boolean orderUpdatesEnabled; private EntityMode defaultEntityMode; + private boolean dataDefinitionImplicitCommit; + private boolean dataDefinitionInTransactionSupported; + public boolean strictJPAQLCompliance; // private BytecodeProvider bytecodeProvider; - Settings() {} + /** + * Package protected constructor + */ + Settings() { + } + // public getters ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + public String getDefaultSchemaName() { return defaultSchemaName; } - public String getDefaultCatalogName() { - return defaultCatalogName; - } + public String getDefaultCatalogName() { + return defaultCatalogName; + } public Dialect getDialect() { return dialect; @@ -115,13 +123,140 @@ return minimalPutsEnabled; } + public Integer getJdbcFetchSize() { + return jdbcFetchSize; + } + + public ConnectionProvider getConnectionProvider() { + return connectionProvider; + } + + public TransactionFactory getTransactionFactory() { + return transactionFactory; + } + + public String getSessionFactoryName() { + return sessionFactoryName; + } + + public boolean isAutoCreateSchema() { + return autoCreateSchema; + } + + public boolean isAutoDropSchema() { + return autoDropSchema; + } + + public boolean isAutoUpdateSchema() { + return autoUpdateSchema; + } + + public Integer getMaximumFetchDepth() { + return maximumFetchDepth; + } + + public CacheProvider getCacheProvider() { + return cacheProvider; + } + + public TransactionManagerLookup getTransactionManagerLookup() { + return transactionManagerLookup; + } + + public boolean isQueryCacheEnabled() { + return queryCacheEnabled; + } + + public boolean isCommentsEnabled() { + return commentsEnabled; + } + + public boolean isSecondLevelCacheEnabled() { + return secondLevelCacheEnabled; + } + + public String getCacheRegionPrefix() { + return cacheRegionPrefix; + } + + public QueryCacheFactory getQueryCacheFactory() { + return queryCacheFactory; + } + + public boolean isStatisticsEnabled() { + return statisticsEnabled; + } + + public boolean isJdbcBatchVersionedData() { + return jdbcBatchVersionedData; + } + + public boolean isFlushBeforeCompletionEnabled() { + return flushBeforeCompletionEnabled; + } + + public BatcherFactory getBatcherFactory() { + return batcherFactory; + } + + public boolean isAutoCloseSessionEnabled() { + return autoCloseSessionEnabled; + } + + public ConnectionReleaseMode getConnectionReleaseMode() { + return connectionReleaseMode; + } + + public QueryTranslatorFactory getQueryTranslatorFactory() { + return queryTranslatorFactory; + } + + public SQLExceptionConverter getSQLExceptionConverter() { + return sqlExceptionConverter; + } + + public boolean isWrapResultSetsEnabled() { + return wrapResultSetsEnabled; + } + + public boolean isOrderUpdatesEnabled() { + return orderUpdatesEnabled; + } + + public boolean isStructuredCacheEntriesEnabled() { + return structuredCacheEntriesEnabled; + } + + public EntityMode getDefaultEntityMode() { + return defaultEntityMode; + } + + public boolean isAutoValidateSchema() { + return autoValidateSchema; + } + + public boolean isDataDefinitionImplicitCommit() { + return dataDefinitionImplicitCommit; + } + + public boolean isDataDefinitionInTransactionSupported() { + return dataDefinitionInTransactionSupported; + } + + public boolean isStrictJPAQLCompliance() { + return strictJPAQLCompliance; + } + + + // package protected setters ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + void setDefaultSchemaName(String string) { defaultSchemaName = string; } - void setDefaultCatalogName(String string) { - defaultCatalogName = string; - } + void setDefaultCatalogName(String string) { + defaultCatalogName = string; + } void setDialect(Dialect dialect) { this.dialect = dialect; @@ -163,44 +298,22 @@ getGeneratedKeysEnabled = b; } - public Integer getJdbcFetchSize() { - return jdbcFetchSize; - } void setJdbcFetchSize(Integer integer) { jdbcFetchSize = integer; } - public ConnectionProvider getConnectionProvider() { - return connectionProvider; - } void setConnectionProvider(ConnectionProvider provider) { connectionProvider = provider; } - public TransactionFactory getTransactionFactory() { - return transactionFactory; - } void setTransactionFactory(TransactionFactory factory) { transactionFactory = factory; } - public String getSessionFactoryName() { - return sessionFactoryName; - } void setSessionFactoryName(String string) { sessionFactoryName = string; } - public boolean isAutoCreateSchema() { - return autoCreateSchema; - } - public boolean isAutoDropSchema() { - return autoDropSchema; - } - - public boolean isAutoUpdateSchema() { - return autoUpdateSchema; - } void setAutoCreateSchema(boolean b) { autoCreateSchema = b; } @@ -208,168 +321,114 @@ void setAutoDropSchema(boolean b) { autoDropSchema = b; } + void setAutoUpdateSchema(boolean b) { autoUpdateSchema = b; } - public Integer getMaximumFetchDepth() { - return maximumFetchDepth; - } void setMaximumFetchDepth(Integer i) { maximumFetchDepth = i; } - public CacheProvider getCacheProvider() { - return cacheProvider; - } void setCacheProvider(CacheProvider cacheProvider) { this.cacheProvider = cacheProvider; } - public TransactionManagerLookup getTransactionManagerLookup() { - return transactionManagerLookup; - } void setTransactionManagerLookup(TransactionManagerLookup lookup) { transactionManagerLookup = lookup; } - public boolean isQueryCacheEnabled() { - return queryCacheEnabled; - } void setQueryCacheEnabled(boolean b) { queryCacheEnabled = b; } - public boolean isCommentsEnabled() { - return commentsEnabled; - } void setCommentsEnabled(boolean commentsEnabled) { this.commentsEnabled = commentsEnabled; } - public boolean isSecondLevelCacheEnabled() { - return secondLevelCacheEnabled; - } void setSecondLevelCacheEnabled(boolean secondLevelCacheEnabled) { this.secondLevelCacheEnabled = secondLevelCacheEnabled; } - public String getCacheRegionPrefix() { - return cacheRegionPrefix; - } void setCacheRegionPrefix(String cacheRegionPrefix) { this.cacheRegionPrefix = cacheRegionPrefix; } - public QueryCacheFactory getQueryCacheFactory() { - return queryCacheFactory; - } - public void setQueryCacheFactory(QueryCacheFactory queryCacheFactory) { + void setQueryCacheFactory(QueryCacheFactory queryCacheFactory) { this.queryCacheFactory = queryCacheFactory; } - public boolean isStatisticsEnabled() { - return statisticsEnabled; - } void setStatisticsEnabled(boolean statisticsEnabled) { this.statisticsEnabled = statisticsEnabled; } - public boolean isJdbcBatchVersionedData() { - return jdbcBatchVersionedData; - } void setJdbcBatchVersionedData(boolean jdbcBatchVersionedData) { this.jdbcBatchVersionedData = jdbcBatchVersionedData; } - public boolean isFlushBeforeCompletionEnabled() { - return flushBeforeCompletionEnabled; - } void setFlushBeforeCompletionEnabled(boolean flushBeforeCompletionEnabled) { this.flushBeforeCompletionEnabled = flushBeforeCompletionEnabled; } - public BatcherFactory getBatcherFactory() { - return batcherFactory; - } void setBatcherFactory(BatcherFactory batcher) { this.batcherFactory = batcher; } - public boolean isAutoCloseSessionEnabled() { - return autoCloseSessionEnabled; - } void setAutoCloseSessionEnabled(boolean autoCloseSessionEnabled) { this.autoCloseSessionEnabled = autoCloseSessionEnabled; } - public ConnectionReleaseMode getConnectionReleaseMode() { - return connectionReleaseMode; - } - - public void setConnectionReleaseMode(ConnectionReleaseMode connectionReleaseMode) { + void setConnectionReleaseMode(ConnectionReleaseMode connectionReleaseMode) { this.connectionReleaseMode = connectionReleaseMode; } - public QueryTranslatorFactory getQueryTranslatorFactory() { - return queryTranslatorFactory; - } - void setQueryTranslatorFactory(QueryTranslatorFactory queryTranslatorFactory) { this.queryTranslatorFactory = queryTranslatorFactory; } - public SQLExceptionConverter getSQLExceptionConverter() { - return sqlExceptionConverter; - } - void setSQLExceptionConverter(SQLExceptionConverter sqlExceptionConverter) { this.sqlExceptionConverter = sqlExceptionConverter; } - public boolean isWrapResultSetsEnabled() { - return wrapResultSetsEnabled; - } - void setWrapResultSetsEnabled(boolean wrapResultSetsEnabled) { this.wrapResultSetsEnabled = wrapResultSetsEnabled; } - public boolean isOrderUpdatesEnabled() { - return orderUpdatesEnabled; - } void setOrderUpdatesEnabled(boolean orderUpdatesEnabled) { this.orderUpdatesEnabled = orderUpdatesEnabled; } - public boolean isStructuredCacheEntriesEnabled() { - return structuredCacheEntriesEnabled; - } void setStructuredCacheEntriesEnabled(boolean structuredCacheEntriesEnabled) { this.structuredCacheEntriesEnabled = structuredCacheEntriesEnabled; } - public EntityMode getDefaultEntityMode() { - return defaultEntityMode; + void setDefaultEntityMode(EntityMode defaultEntityMode) { + this.defaultEntityMode = defaultEntityMode; } - public void setDefaultEntityMode(EntityMode defaultEntityMode) { - this.defaultEntityMode = defaultEntityMode; + void setAutoValidateSchema(boolean autoValidateSchema) { + this.autoValidateSchema = autoValidateSchema; } - public boolean isAutoValidateSchema() { - return autoValidateSchema; + void setDataDefinitionImplicitCommit(boolean dataDefinitionImplicitCommit) { + this.dataDefinitionImplicitCommit = dataDefinitionImplicitCommit; } - void setAutoValidateSchema(boolean autoValidateSchema) { - this.autoValidateSchema = autoValidateSchema; + void setDataDefinitionInTransactionSupported(boolean dataDefinitionInTransactionSupported) { + this.dataDefinitionInTransactionSupported = dataDefinitionInTransactionSupported; } + void setStrictJPAQLCompliance(boolean strictJPAQLCompliance) { + this.strictJPAQLCompliance = strictJPAQLCompliance; + } + + + // public BytecodeProvider getBytecodeProvider() { // return bytecodeProvider; // } // -// public void setBytecodeProvider(BytecodeProvider bytecodeProvider) { +// void setBytecodeProvider(BytecodeProvider bytecodeProvider) { // this.bytecodeProvider = bytecodeProvider; // } } Modified: trunk/Hibernate3/src/org/hibernate/cfg/SettingsFactory.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/SettingsFactory.java 2006-06-06 17:20:50 UTC (rev 9988) +++ trunk/Hibernate3/src/org/hibernate/cfg/SettingsFactory.java 2006-06-06 17:21:38 UTC (rev 9989) @@ -63,12 +63,14 @@ settings.setConnectionProvider(connections); //Interrogate JDBC metadata - + + String databaseName = null; + int databaseMajorVersion = 0; boolean metaSupportsScrollable = false; boolean metaSupportsGetGeneratedKeys = false; boolean metaSupportsBatchUpdates = false; - String databaseName = null; - int databaseMajorVersion = 0; + boolean metaReportsDDLCausesTxnCommit = false; + boolean metaReportsDDLInTxnSupported = true; try { Connection conn = connections.getConnection(); @@ -81,6 +83,8 @@ metaSupportsScrollable = meta.supportsResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE); metaSupportsBatchUpdates = meta.supportsBatchUpdates(); + metaReportsDDLCausesTxnCommit = meta.dataDefinitionCausesTransactionCommit(); + metaReportsDDLInTxnSupported = !meta.dataDefinitionIgnoredInTransactions(); if ( Environment.jvmSupportsGetGeneratedKeys() ) { try { @@ -107,7 +111,10 @@ catch (UnsupportedOperationException uoe) { // user supplied JDBC connections } - + settings.setDataDefinitionImplicitCommit( metaReportsDDLCausesTxnCommit ); + settings.setDataDefinitionInTransactionSupported( metaReportsDDLInTxnSupported ); + + //SQL Dialect: Dialect dialect = determineDialect( props, databaseName, databaseMajorVersion ); settings.setDialect(dialect); @@ -204,6 +211,10 @@ Map querySubstitutions = PropertiesHelper.toMap(Environment.QUERY_SUBSTITUTIONS, " ,=;:\n\t\r\f", properties); log.info("Query language substitutions: " + querySubstitutions); settings.setQuerySubstitutions(querySubstitutions); + + boolean jpaqlCompliance = PropertiesHelper.getBoolean( Environment.JPAQL_STRICT_COMPLIANCE, properties, false ); + settings.setStrictJPAQLCompliance( jpaqlCompliance ); + log.info( "JPA-QL strict compliance: " + enabledDisabled( jpaqlCompliance ) ); // Second-level / query cache: Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/exec/AbstractStatementExecutor.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/hql/ast/exec/AbstractStatementExecutor.java 2006-06-06 17:20:50 UTC (rev 9988) +++ trunk/Hibernate3/src/org/hibernate/hql/ast/exec/AbstractStatementExecutor.java 2006-06-06 17:21:38 UTC (rev 9989) @@ -130,8 +130,13 @@ } } }; - if ( getFactory().getDialect().performTemporaryTableDDLInIsolation() ) { - Isolater.doIsolatedWork( work, session ); + if ( getFactory().getSettings().isDataDefinitionImplicitCommit() || getFactory().getDialect().performTemporaryTableDDLInIsolation() ) { + if ( getFactory().getSettings().isDataDefinitionInTransactionSupported() ) { + Isolater.doIsolatedWork( work, session ); + } + else { + Isolater.doNonTransactedWork( work, session ); + } } else { work.doWork( session.getJDBCContext().getConnectionManager().getConnection() ); @@ -149,7 +154,7 @@ stmnt.executeUpdate( "drop table " + persister.getTemporaryIdTableName() ); } catch( Throwable t ) { - log.warn( "unable to drop temporary id table after use", t ); + log.warn( "unable to drop temporary id table after use [" + t.getMessage() + "]" ); } finally { if ( stmnt != null ) { @@ -163,8 +168,13 @@ } } }; - if ( getFactory().getDialect().performTemporaryTableDDLInIsolation() ) { - Isolater.doIsolatedWork( work, session ); + if ( getFactory().getSettings().isDataDefinitionImplicitCommit() || getFactory().getDialect().performTemporaryTableDDLInIsolation() ) { + if ( getFactory().getSettings().isDataDefinitionInTransactionSupported() ) { + Isolater.doIsolatedWork( work, session ); + } + else { + Isolater.doNonTransactedWork( work, session ); + } } else { work.doWork( session.getJDBCContext().getConnectionManager().getConnection() ); @@ -179,7 +189,7 @@ ps.executeUpdate(); } catch( Throwable t ) { - log.warn( "unable to cleanup temporary id table after use", t ); + log.warn( "unable to cleanup temporary id table after use [" + t + "]" ); } finally { if ( ps != null ) { Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/tree/SelectClause.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/hql/ast/tree/SelectClause.java 2006-06-06 17:20:50 UTC (rev 9988) +++ trunk/Hibernate3/src/org/hibernate/hql/ast/tree/SelectClause.java 2006-06-06 17:21:38 UTC (rev 9989) @@ -10,6 +10,7 @@ import org.hibernate.hql.ast.util.ASTAppender; import org.hibernate.hql.ast.util.ASTIterator; import org.hibernate.hql.ast.util.ASTPrinter; +import org.hibernate.hql.ast.QuerySyntaxException; import org.hibernate.type.Type; import org.hibernate.QueryException; @@ -255,6 +256,9 @@ if ( prepared ) { throw new IllegalStateException( "SelectClause was already prepared!" ); } + if ( getSessionFactoryHelper().isStrictJPAQLComplianceEnabled() ) { + throw new QuerySyntaxException( "JPA-QL compliance requires select clause" ); + } List fromElements = fromClause.getProjectionList(); ASTAppender appender = new ASTAppender( getASTFactory(), this ); // Get ready to start adding nodes. Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/util/SessionFactoryHelper.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/hql/ast/util/SessionFactoryHelper.java 2006-06-06 17:20:50 UTC (rev 9988) +++ trunk/Hibernate3/src/org/hibernate/hql/ast/util/SessionFactoryHelper.java 2006-06-06 17:21:38 UTC (rev 9989) @@ -379,4 +379,8 @@ public String[][] generateColumnNames(Type[] sqlResultTypes) { return NameGenerator.generateColumnNames( sqlResultTypes, sfi ); } + + public boolean isStrictJPAQLComplianceEnabled() { + return sfi.getSettings().isStrictJPAQLCompliance(); + } } |