@Test @TestForIssue( jiraKey = "HHH-10515" ) public void testNoJdbcMetadataDefaultDialect() { final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySetting( "hibernate.temp.use_jdbc_metadata_defaults", "false" ) .build(); JdbcEnvironment jdbcEnvironment = serviceRegistry.getService( JdbcEnvironment.class ); ExtractedDatabaseMetaData extractedDatabaseMetaData = jdbcEnvironment.getExtractedDatabaseMetaData(); assertNull( extractedDatabaseMetaData.getConnectionCatalogName() ); assertNull( extractedDatabaseMetaData.getConnectionSchemaName() ); assertTrue( extractedDatabaseMetaData.getTypeInfoSet().isEmpty() ); assertTrue( extractedDatabaseMetaData.getExtraKeywords().isEmpty() ); assertFalse( extractedDatabaseMetaData.supportsNamedParameters() ); assertFalse( extractedDatabaseMetaData.supportsRefCursors() ); assertFalse( extractedDatabaseMetaData.supportsScrollableResults() ); assertFalse( extractedDatabaseMetaData.supportsGetGeneratedKeys() ); assertFalse( extractedDatabaseMetaData.supportsBatchUpdates() ); assertFalse( extractedDatabaseMetaData.supportsDataDefinitionInTransaction() ); assertFalse( extractedDatabaseMetaData.doesDataDefinitionCauseTransactionCommit() ); assertNull( extractedDatabaseMetaData.getSqlStateType() ); assertFalse( extractedDatabaseMetaData.doesLobLocatorUpdateCopy() ); StandardServiceRegistryBuilder.destroy( serviceRegistry ); }
/** * Get the database sequence increment value from the associated {@link SequenceInformation} object. * * @param jdbcEnvironment the current JdbcEnvironment * @param sequenceName sequence name * * @return sequence increment value */ private Long getSequenceIncrementValue(JdbcEnvironment jdbcEnvironment, String sequenceName) { return jdbcEnvironment.getExtractedDatabaseMetaData().getSequenceInformationList().stream().filter( sequenceInformation -> { Identifier catalog = sequenceInformation.getSequenceName().getCatalogName(); Identifier schema = sequenceInformation.getSequenceName().getSchemaName(); return sequenceName.equalsIgnoreCase( sequenceInformation.getSequenceName().getSequenceName().getText() ) && ( catalog == null || catalog.equals( jdbcEnvironment.getCurrentCatalog() ) ) && ( schema == null || schema.equals( jdbcEnvironment.getCurrentSchema() ) ); } ).map( SequenceInformation::getIncrementValue ).findFirst().orElse( null ); } }
if ( meta.doesDataDefinitionCauseTransactionCommit() ) { if ( meta.supportsDataDefinitionInTransaction() ) { this.tempTableDdlTransactionHandling = TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT; if ( !meta.supportsBatchUpdates() ) { this.jdbcBatchSize = 0; USE_SCROLLABLE_RESULTSET, configurationSettings, meta.supportsScrollableResults() ); this.wrapResultSetsEnabled = ConfigurationHelper.getBoolean( USE_GET_GENERATED_KEYS, configurationSettings, meta.supportsGetGeneratedKeys() ); this.jdbcFetchSize = ConfigurationHelper.getInteger( STATEMENT_FETCH_SIZE, configurationSettings );
@Override public ResultSet getResultSet(CallableStatement statement, String name) { if ( jdbcServices.getExtractedMetaDataSupport().supportsRefCursors() ) { try { return (ResultSet) getResultSetByNameMethod().invoke( statement, name, ResultSet.class );
this.currentCatalog = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionCatalogName() ); this.currentSchema = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionSchemaName() );
private boolean canDoNameParameterBinding(Type hibernateType) { final ExtractedDatabaseMetaData databaseMetaData = procedureCall.getSession() .getJdbcCoordinator() .getJdbcSessionOwner() .getJdbcSessionContext() .getServiceRegistry().getService( JdbcEnvironment.class ) .getExtractedDatabaseMetaData(); return databaseMetaData.supportsNamedParameters() && ProcedureParameterNamedBinder.class.isInstance( hibernateType ) && ((ProcedureParameterNamedBinder) hibernateType).canDoSetting(); }
if ( meta.doesDataDefinitionCauseTransactionCommit() ) { if ( meta.supportsDataDefinitionInTransaction() ) { this.tempTableDdlTransactionHandling = TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT; if ( !meta.supportsBatchUpdates() ) { this.jdbcBatchSize = 0; USE_SCROLLABLE_RESULTSET, configurationSettings, meta.supportsScrollableResults() ); this.wrapResultSetsEnabled = ConfigurationHelper.getBoolean( USE_GET_GENERATED_KEYS, configurationSettings, meta.supportsGetGeneratedKeys() ); this.jdbcFetchSize = ConfigurationHelper.getInteger( STATEMENT_FETCH_SIZE, configurationSettings );
@Override public ResultSet getResultSet(CallableStatement statement, int position) { if ( jdbcServices.getExtractedMetaDataSupport().supportsRefCursors() ) { try { return (ResultSet) getResultSetByPositionMethod().invoke( statement, position, ResultSet.class );
this.currentCatalog = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionCatalogName() ); this.currentSchema = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionSchemaName() );
@Override public ResultSet extractResultSet( CallableStatement callableStatement, SharedSessionContractImplementor session) { final boolean supportsNamedParameters = session.getJdbcServices() .getJdbcEnvironment() .getExtractedDatabaseMetaData() .supportsNamedParameters(); final boolean useNamed = supportsNamedParameters && jdbcParameterName != null; if ( useNamed ) { return session.getFactory() .getServiceRegistry() .getService( RefCursorSupport.class ) .getResultSet( callableStatement, jdbcParameterName ); } else { return session.getFactory() .getServiceRegistry() .getService( RefCursorSupport.class ) .getResultSet( callableStatement, jdbcParameterPosition ); } } }
@Test @TestForIssue( jiraKey = "HHH-10515" ) public void testNoJdbcMetadataDialectOverride() { final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySetting( "hibernate.temp.use_jdbc_metadata_defaults", "false" ) .applySetting( AvailableSettings.DIALECT, TestDialect.class.getName() ) .build(); JdbcEnvironment jdbcEnvironment = serviceRegistry.getService( JdbcEnvironment.class ); ExtractedDatabaseMetaData extractedDatabaseMetaData = jdbcEnvironment.getExtractedDatabaseMetaData(); assertNull( extractedDatabaseMetaData.getConnectionCatalogName() ); assertNull( extractedDatabaseMetaData.getConnectionSchemaName() ); assertTrue( extractedDatabaseMetaData.getTypeInfoSet().isEmpty() ); assertTrue( extractedDatabaseMetaData.getExtraKeywords().isEmpty() ); assertTrue( extractedDatabaseMetaData.supportsNamedParameters() ); assertFalse( extractedDatabaseMetaData.supportsRefCursors() ); assertFalse( extractedDatabaseMetaData.supportsScrollableResults() ); assertFalse( extractedDatabaseMetaData.supportsGetGeneratedKeys() ); assertFalse( extractedDatabaseMetaData.supportsBatchUpdates() ); assertFalse( extractedDatabaseMetaData.supportsDataDefinitionInTransaction() ); assertFalse( extractedDatabaseMetaData.doesDataDefinitionCauseTransactionCommit() ); assertNull( extractedDatabaseMetaData.getSqlStateType() ); assertFalse( extractedDatabaseMetaData.doesLobLocatorUpdateCopy() ); StandardServiceRegistryBuilder.destroy( serviceRegistry ); }
@Override public void registerRefCursorParameter(CallableStatement statement, String name) { if ( jdbcServices.getExtractedMetaDataSupport().supportsRefCursors() ) { try { statement.registerOutParameter( name, refCursorTypeCode() ); } catch (SQLException e) { throw jdbcServices.getSqlExceptionHelper().convert( e, "Error registering REF_CURSOR parameter [" + name + "]" ); } } else { try { jdbcServices.getDialect().registerResultSetOutParameter( statement, name ); } catch (SQLException e) { throw jdbcServices.getSqlExceptionHelper().convert( e, "Error asking dialect to register ref cursor parameter [" + name + "]" ); } } }
/** * Get the database sequence increment value from the associated {@link SequenceInformation} object. * * @param jdbcEnvironment the current JdbcEnvironment * @param sequenceName sequence name * * @return sequence increment value */ private Long getSequenceIncrementValue(JdbcEnvironment jdbcEnvironment, String sequenceName) { return jdbcEnvironment.getExtractedDatabaseMetaData().getSequenceInformationList().stream().filter( sequenceInformation -> { Identifier catalog = sequenceInformation.getSequenceName().getCatalogName(); Identifier schema = sequenceInformation.getSequenceName().getSchemaName(); return sequenceName.equalsIgnoreCase( sequenceInformation.getSequenceName().getSequenceName().getText() ) && ( catalog == null || catalog.equals( jdbcEnvironment.getCurrentCatalog() ) ) && ( schema == null || schema.equals( jdbcEnvironment.getCurrentSchema() ) ); } ).map( SequenceInformation::getIncrementValue ).findFirst().orElse( null ); } }
@Override public void registerRefCursorParameter(CallableStatement statement, int position) { if ( jdbcServices.getExtractedMetaDataSupport().supportsRefCursors() ) { try { statement.registerOutParameter( position, refCursorTypeCode() ); } catch (SQLException e) { throw jdbcServices.getSqlExceptionHelper().convert( e, "Error registering REF_CURSOR parameter [" + position + "]" ); } } else { try { jdbcServices.getDialect().registerResultSetOutParameter( statement, position ); } catch (SQLException e) { throw jdbcServices.getSqlExceptionHelper().convert( e, "Error asking dialect to register ref cursor parameter [" + position + "]" ); } } }
@Override public ResultSet getResultSet(CallableStatement statement, String name) { if ( jdbcServices.getExtractedMetaDataSupport().supportsRefCursors() ) { try { return (ResultSet) getResultSetByNameMethod().invoke( statement, name, ResultSet.class );
@Override public ResultSet getResultSet(CallableStatement statement, int position) { if ( jdbcServices.getExtractedMetaDataSupport().supportsRefCursors() ) { try { return (ResultSet) getResultSetByPositionMethod().invoke( statement, position, ResultSet.class );
@Override public void registerRefCursorParameter(CallableStatement statement, int position) { if ( jdbcServices.getExtractedMetaDataSupport().supportsRefCursors() ) { try { statement.registerOutParameter( position, refCursorTypeCode() ); } catch (SQLException e) { throw jdbcServices.getSqlExceptionHelper().convert( e, "Error registering REF_CURSOR parameter [" + position + "]" ); } } else { try { jdbcServices.getDialect().registerResultSetOutParameter( statement, position ); } catch (SQLException e) { throw jdbcServices.getSqlExceptionHelper().convert( e, "Error asking dialect to register ref cursor parameter [" + position + "]" ); } } }
@Override public void registerRefCursorParameter(CallableStatement statement, String name) { if ( jdbcServices.getExtractedMetaDataSupport().supportsRefCursors() ) { try { statement.registerOutParameter( name, refCursorTypeCode() ); } catch (SQLException e) { throw jdbcServices.getSqlExceptionHelper().convert( e, "Error registering REF_CURSOR parameter [" + name + "]" ); } } else { try { jdbcServices.getDialect().registerResultSetOutParameter( statement, name ); } catch (SQLException e) { throw jdbcServices.getSqlExceptionHelper().convert( e, "Error asking dialect to register ref cursor parameter [" + name + "]" ); } } }