HibernateException: использование DefaultSchemaNameResolver требует, чтобы Dialect предоставил правильную инструкцию / команду SQL - PullRequest
1 голос
/ 17 апреля 2019

Я использую приложение весенней загрузки версии 2.1.4.Приложение использует hibernate 5.4.2.Final и драйвер postgresql версии 42.2.5.Недавно я попытался сгенерировать DDL из спящего режима, чтобы увидеть DDL, и наткнулся на ошибку, которая беспокоит меня уже несколько дней.Использование версии PostgreSQL 11.2 (Ubuntu 11.2-1.pgdg18.04 + 1)

Теперь, когда приложение загружается, оно каждый раз запускается в этом исключении.

Если я ставлю точку останова на метод

org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver.determineAppropriateResolverDelegate(Connection connection)

, я вижу, где происходит исключение, т.е. в точке

connection.getSchema();

, в этом есть полезные комментариикласс

unfortunately Connection#getSchema is only available in Java 1.7 and above
and Hibernate still baselines on 1.6.  So for now, use reflection and
leverage the Connection#getSchema method if it is available.

If the JDBC driver does not implement the Java 7 spec, but the JRE is Java 7
then the getSchemaMethod is not null but the call to getSchema() throws an java.lang.AbstractMethodError

хорошо, я использую версию выше 7, т.е.:

java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

Я все еще сталкиваюсь со следующим исключением при запуске весенней загрузки, т. е. !!!!ДАЖЕ ДО ЧАСТИ КОДА (ФАСОЛОВ) ДОСТИГНУТЫ !!!которые должны генерировать DDL, т.е. метод createSchemaWithHibernate5 (LocalSessionFactoryBean sessionFactory).Так что это как-то связано с конфигом или типом соединения.Когда я устанавливаю точку останова на то тип соединения, который я вижу, он имеет тип

org.apache.commons.dbcp.PoolableConnection

, который расширяется от "DelegatingConnection", который НЕ реализует метод getSchema (), хотя он расширяет интерфейс

java.sql.Connection 

, который имеет метод getSchema ().Я не уверен, как это вообще должно работать, поскольку ни один из них не является окончательным или абстрактным классом.

Я также вижу, что есть еще один класс с именем

org.postgresql.jdbc.PgConnection. 

Как я могу заставить это приложение использовать это приложение, поскольку я вижу, что он действительно реализует метод getSchema ().

Вот исключение, с которым я сталкиваюсь:

2019-04-17 10:06:42.487 DEBUG tito-pc --- [  restartedMain] .i.f.i.DefaultIdentifierGeneratorFactory : Registering IdentifierGenerator strategy [enhanced-table] -> [org.hibernate.id.enhanced.TableGenerator]
2019-04-17 10:06:43.004 DEBUG tito-pc --- [  restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator     : Database ->
       name : PostgreSQL
    version : 11.2 (Ubuntu 11.2-1.pgdg18.04+1)
      major : 11
      minor : 2
2019-04-17 10:06:43.004 DEBUG tito-pc --- [  restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator     : Driver ->
       name : PostgreSQL JDBC Driver
    version : 42.2.5
      major : 42
      minor : 2
2019-04-17 10:06:43.005 DEBUG tito-pc --- [  restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator     : JDBC version : 4.2
2019-04-17 10:06:43.023  INFO tito-pc --- [  restartedMain] o.h.d.Dialect                            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect
2019-04-17 10:06:43.053 DEBUG tito-pc --- [  restartedMain] o.h.e.j.e.s.IdentifierHelperBuilder      : JDBC driver metadata reported database stores quoted identifiers in neither upper, lower nor mixed case
2019-04-17 10:06:54.515 DEBUG tito-pc --- [  restartedMain] o.h.e.j.e.i.DefaultSchemaNameResolver    : Unable to use Java 1.7 Connection#getSchema
2019-04-17 10:06:59.058 DEBUG tito-pc --- [  restartedMain] o.h.e.j.e.i.JdbcEnvironmentImpl          : Unable to resolve connection default schema
org.hibernate.HibernateException: Use of DefaultSchemaNameResolver requires Dialect to provide the proper SQL statement/command but provided Dialect [org.hibernate.dialect.PostgreSQL95Dialect] did not return anything from Dialect#getCurrentSchemaCommand
    at org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver$SchemaNameResolverFallbackDelegate.resolveSchemaName(DefaultSchemaNameResolver.java:100)
    at org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver.resolveSchemaName(DefaultSchemaNameResolver.java:76)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.determineCurrentSchemaName(JdbcEnvironmentImpl.java:311)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.<init>(JdbcEnvironmentImpl.java:266)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:114)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:175)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
    at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:615)
    at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:599)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
    .....

Вот моя конфигурация персистентности:

@Profile("Development")
@Configuration
@EnableTransactionManagement
@Order(value=1)
public class PersistenceConfigDevelopment {


    private static Logger logger = LogManager.getLogger(PersistenceConfigDevelopment.class.getName());

    @Bean
    @Primary
    public org.apache.commons.dbcp.BasicDataSource dataSourceReadWrite1() {

        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        dataSource.setUrl("jdbc:postgresql://localhost:5432/develpmentTestDb");
        dataSource.setUsername("admin");
        dataSource.setPassword("notABigSecret");
        dataSource.setInitialSize(20);
        dataSource.setMaxActive(-1);


        return dataSource;
    }




    @Bean
    @Primary
    public org.springframework.orm.hibernate5.LocalSessionFactoryBean sessionFactory() {

        org.springframework.orm.hibernate5.LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setHibernateProperties(hibernateProperties());
        sessionFactory.setDataSource(this.dataSourceReadWrite1());
        sessionFactory.setPackagesToScan("org.university.");


        return sessionFactory;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory().getObject());

        return txManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }   


    @Bean
    public Properties hibernateProperties() {
        return new Properties() {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            {
                setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL95Dialect");
                setProperty("hibernate.chach.provider_class", "org.hibernate.cache.NoCacheProvider");
                setProperty("hibernate.show_sql", "true");
                setProperty("hibernate.hbm2ddl.auto", "create-drop");

                setProperty("hibernate.cache.use_second_level_cache", "false");
                setProperty("hibernate.cache.use_query_cache", "false");

                // isolation level
                setProperty("hibernate.connection.isolation", String.valueOf(Connection.TRANSACTION_SERIALIZABLE));


            }
        };
    }       

    @Bean
    public Boolean createSchemaWithHibernate5(LocalSessionFactoryBean sessionFactory) {

        final PostgreSQL95Dialect dialect = new PostgreSQL95Dialect();
        StandardServiceRegistry serviceRegistry = sessionFactory.getConfiguration().getStandardServiceRegistryBuilder()
                .applySetting("hibernate.dialect", dialect)
                .build();

        Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();

        new SchemaExport() 
                .setOutputFile("db-schema.hibernate5.ddl") 
                .create(EnumSet.of(TargetType.SCRIPT), metadata);

        metadata.buildSessionFactory().close();

        return Boolean.TRUE;
    }


}

Из-за этого сообщения stackoverflow я попытался сменить драйверы, т.е.

Реализация метода org.postgresql.jdbc4.Jdbc4Connection.getSchema ()

и попытался использовать артефакт "postgresql" maven вместо "org.postgresql", но это не помогло какхорошо.

Любая помощь действительно приветствуется.

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
<!--             <version>${orgpostgresql.version}</version> -->
        </dependency>

<!--         <dependency> -->
<!--             <groupId>postgresql</groupId> -->
<!--             <artifactId>postgresql</artifactId> -->
<!--             <version>${postgresql.version}</version> -->
<!--         </dependency> -->

обновление 17 апреля

Мне удалось избавиться от исключения, используя другой источник данных, например PGSimpleDataSource, который такжеизменил соединитель на PgConnection, но DDL все еще не генерируется.Т.е. файл db-schema.hibernate5.ddl создается, но он пуст.

@Bean
@Primary
public PGSimpleDataSource dataSourceReadWrite1() {

    PGSimpleDataSource dataSource = new PGSimpleDataSource();
    dataSource.setUrl("jdbc:postgresql://localhost:5432/developmentTestDB");
    dataSource.setUser("admin");
    dataSource.setPassword("notABigSecret");


    return dataSource;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...