орг.зимовать.HibernateException: доступ к DialectResolutionInfo не может быть null, когда ' hibernate.диалект ' не установлен



Я пытаюсь запустить приложение spring-boot, которое использует hibernate через spring-jpa, но я получаю эту ошибку:



Caused by: 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:104)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:71)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:205)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:850)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
... 21 more


мой пом.XML-файл это:



<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.8.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
</dependencies>


моя конфигурация hibernate такова (конфигурация диалекта находится в последнем методе из этого класса):



@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.spring.app" })
public class HibernateConfig {

@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

sessionFactory.setDataSource(restDataSource());
sessionFactory.setPackagesToScan(new String[] { "com.spring.app.model" });
sessionFactory.setHibernateProperties(hibernateProperties());

return sessionFactory;
}

@Bean
public DataSource restDataSource() {
BasicDataSource dataSource = new BasicDataSource();

dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl("jdbc:postgresql://localhost:5432/teste?charSet=LATIN1");
dataSource.setUsername("klebermo");
dataSource.setPassword("123");

return dataSource;
}

@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}

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

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

{
setProperty("hibernate.hbm2ddl.auto", "create");
setProperty("hibernate.show_sql", "false");
setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
}
};
}
}


что я здесь делаю не так?

575   21  

21 ответов:

Сначала удалите все ваши настройки Spring Boot запустит его для вас. Если вам действительно нужно SessionFactory вместо EntityManagerFactory добавить HibernateJpaSessionFactoryBean.

убедитесь, что у вас есть application.properties в вашем classpath и добавьте следующие свойства.

spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/teste?charSet=LATIN1
spring.datasource.username=klebermo
spring.datasource.password=123

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create

Если вам действительно нужен доступ к SessionFactory и это в основном для того же источника данных, то вы можете сделать следующее (который также docmented здесь хотя для XML, не JavaConfig).

@Configuration        
public class HibernateConfig {

    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}

таким образом, у вас есть оба EntityManagerFactory и SessionFactory.

если у вас есть класс с main метод @EnableAutoConfiguration не требуется @EnableTransactionManagement аннотация, так как это будет включено Spring Boot для вас. Базовый класс приложения в com.spring.app пакет должен быть достаточно.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

} 

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

я бы также предложил удалить commons-dbcp зависимость, поскольку это позволит Spring Boot настроить более быстрый и надежный HikariCP реализация.

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

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

Я получил эту ошибку, когда моя база данных не была создана. После создания БД вручную, он работал нормально.

Я также столкнулся с подобной проблемой. Но, это было из-за неверного пароля, предоставленного. Кроме того, я хотел бы сказать, что ваш код, похоже, является старым кодом стиля с использованием spring. Вы уже упоминали, что используете spring boot, что означает, что большинство вещей будет автоматически настроено для вас. hibernate диалект будет автоматически выбран на основе драйвера БД, доступного на пути к классам вместе с действительными учетными данными, которые могут быть использованы для проверки соединения должным образом. Он есть какие-либо проблемы с подключением вас снова та же ошибка. только 3 свойства, необходимые в приложении.свойства

# Replace with your connection string
spring.datasource.url=jdbc:mysql://localhost:3306/pdb1

# Replace with your credentials
spring.datasource.username=root
spring.datasource.password=

добавить spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect в приложения.свойства файла

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

Я создал БД, проверил строку URL / connection и reran, и все работало так, как ожидалось.

это происходит потому, что ваш код не Бейл для подключения к базе данных. Убедитесь, что у вас есть драйвер mysql и имя пользователя, пароль правильный.

убедитесь, что ваш application.properties имеет всю правильную информацию: (я изменил свой порт БД от 8889 до 3306 он работал)

 db.url: jdbc:mysql://localhost:3306/test

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

WARN HHH000342: Could not obtain connection to query metadata : Login failed for user 'my_user'.

убедитесь, что у вас есть база данных в вашем pom, как OP сделал. Это была моя проблема.

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

У меня была та же проблема и это было вызвано невозможностью подключения к экземпляру базы данных. Ищите ошибку hibernate HHH000342 в журнале выше этой ошибки, она должна дать вам представление о том, где соединение с БД не работает (неверное имя пользователя/pass, url и т. д.)

Если вы используете эту строку:

sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect"));

убедитесь в том, что env.getProperty("hibernate.dialect") не null.

Это случилось со мной, потому что я не добавил conf.configure(); перед началом сессии:

Configuration conf = new Configuration();
conf.configure();

убедитесь, что вы ввели действительную информацию в приложение.свойства и доступен ли ваш сервер баз данных. В качестве примера при подключении к MySQL проверьте, является ли XAMPP работает нормально.

я столкнулся с той же проблемой: БД, которую я пытался подключить, не существовала. Я использовал jpa.database=default (что, я думаю, означает, что он попытается подключиться к базе данных, а затем автоматически выбрать диалект). Как только я запустил базу данных, она работала нормально без каких-либо изменений.

то же самое, но в JBoss WildFly AS.

решена со свойствами в моем META-INF/persistence.xml

<properties>
            <property name="hibernate.transaction.jta.platform"
                value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
            <property name="spring.jpa.database-platform" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="spring.jpa.show-sql" value="false" />
</properties>

для тех, кто работает с AWS MySQL RDS, это может произойти, когда вы не можете подключиться к базе данных. Перейти на АРМ, групп безопасности, установка для RDS MySQL и редактирование входящих IP-правило, обновив сайт myip.

Я столкнулся с этой проблемой и делать выше получил проблему исправлена для меня.

Я столкнулся с этой проблемой из-за версии Mysql 8.0.11, возвращающейся обратно к 5.7, решенной для меня

у меня была такая же ошибка после использования генерации кода hibernate

https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/

тут hibernate.cfg.xml создано в /src/main/java но без параметров подключения после его удаления-моя проблема была решена

Я получил эту проблему, когда Eclipse не удалось найти драйвер JDBC. Пришлось сделать обновление gradle из eclipse, чтобы получить эту работу.

Comments

    Ничего не найдено.