HibernateException: hibernate.dialect не установлен, но я установил его в application.properties - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю над приложением Spring Boot, которое использует несколько баз данных.Я определяю источники данных, я определяю сущностные менеджеры и продолжаю получать эту ошибку

org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)

Это файл @Configuration для одной базы данных:

@Configuration
public class CustomerDbConfig {

@Bean
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

@Bean(name = "customerEntityManager")
@PersistenceContext(unitName = "customerEntityManager")
public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
        EntityManagerFactoryBuilder builder, DataSource dataSource) {
    return builder.dataSource(dataSource).packages("com.example.report_service").build();
}

@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(emf);
    return jpaTransactionManager;
}

@Bean
public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
    return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
}

}

и это application.properties

spring.datasource.url=jdbc:postgresql://dv1.example.com:5432/customer
spring.datasource.username=${DATABASECUSTOMERUSERNAME:customer}
spring.datasource.password=${DATABASECUSTOMERPASSWORD:customer}
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.hikari.minimum-idle=2
spring.datasource.hikari.maximum-pool-size=${MAX_POOL_SIZE:20}
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-query-timeout=5000
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.test-on-connect=true
spring.transaction.default-timeout=${TRANSACTION_TIMEOUT:3600}
spring.jpa.properties.hibernate.proc.param_null_passing=true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true
spring.jpa.open-in-view=false
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.type=trace
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Когда я явно устанавливаю имя persistenceUnit в EntityManager, ошибка меняется, он жалуется, что не нашел PU с указанным мною именем.

Я ограничил свое приложение только одной базой данных, пытаясь выяснить, что происходит.Когда я удаляю файл конфигурации, никаких проблем не возникает.Особенностью этого приложения является то, что оно использует только собственные запросы, у него нет классов @Entity, потому что база данных обновляется другими приложениями.Когда я удаляю часть .packages (..) из кода, он жалуется как

No persistence units parsed from {classpath*:META-INF/persistence.xml}

Я подозреваю, что проблема связана с тем фактом, что у нас нет классов, которые нужно сканировать.

Редактировать: После ответа M.Deinum я заменил конфигурацию на

@Configuration
@EnableTransactionManagement
public class CustomerDbConfig {

@ConfigurationProperties(prefix = "customer.datasource")
@Bean(name = "customer-datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

@Bean(name = "customer-jdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(@Qualifier("customer-datasource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

}

и использую четыре шаблона в даосах.Работает как шарм.

1 Ответ

1 голос
/ 26 сентября 2019

При использовании JPA вам нужны объекты.Использование классов JPA для простого выполнения SQL-запросов излишне.Просто используйте для этого простой Jdbctemplate или NamedParameterJdbcTemplate.

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