орг.зимовать.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");
}
};
}
}
что я здесь делаю не так?
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'.
У меня была та же проблема и это было вызвано невозможностью подключения к экземпляру базы данных. Ищите ошибку 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