Kle*_*ota 178 java hibernate jpa maven spring-boot
我正在尝试运行一个spring-boot应用程序,它通过spring-jpa使用hibernate,但是我收到了这个错误:
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$4.perform(EntityManagerFactoryBuilderImpl.java:850)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.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
Run Code Online (Sandbox Code Playgroud)
我的pom.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>
Run Code Online (Sandbox Code Playgroud)
我的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");
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
M. *_*num 180
首先删除所有配置Spring Boot将为您启动它.如果你真的需要一个SessionFactory而不是EntityManagerFactory添加一个HibernateJpaSessionFactoryBean.
确保application.properties在类路径中有一个并添加以下属性.
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
Run Code Online (Sandbox Code Playgroud)
如果您确实需要访问a SessionFactory并且基本上是针对相同的数据源,那么您可以执行以下操作(尽管对于XML而不是JavaConfig,此处也会对其进行说明).
@Configuration
public class HibernateConfig {
@Bean
public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
factory.setEntityManagerFactory(emf);
return factory;
}
}
Run Code Online (Sandbox Code Playgroud)
这样你既有a EntityManagerFactory又有a 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);
}
}
Run Code Online (Sandbox Code Playgroud)
这样的东西应该足以让你的所有类(包括实体和基于Spring Data的存储库)被检测到.
我还建议删除commons-dbcp依赖项,因为这将允许Spring Boot配置更快,更健壮的HikariCP实现.
mhn*_*oka 131
在数据库服务器启动时启动应用程序(使用Spring Boot)时,我遇到了类似的问题.
Hibernate可以确定自动使用的正确方言,但为了做到这一点,它需要与数据库的实时连接.
ACV*_*ACV 21
我的数据库没有创建时出现此错误.手动创建数据库后,它工作正常.
alp*_*ine 19
添加spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialectapplication.properties文件
Pan*_*kaj 17
我也遇到过类似的问题.但是,这是由于提供的密码无效.另外,我想说你的代码似乎是使用spring的旧样式代码.您已经提到过您正在使用spring boot,这意味着大部分内容都将自动为您配置.将根据类路径上可用的数据库驱动程序以及可用于正确测试连接的有效凭据自动选择hibernate dialect.连接有任何问题,您将再次面临同样的错误.application.properties中只需要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=
Run Code Online (Sandbox Code Playgroud)
以下是hibernate.dialect未设置问题的一些原因。大多数异常都显示在启动日志中,最后是提到的问题。
示例:在带有 Postgres DB 的 Spring boot 应用程序中
org.postgresql.util.PSQLException:致命:数据库“foo”不存在
在application.properties文件中,
spring.datasource.url = jdbc:postgresql://localhost:5432/foo
Run Code Online (Sandbox Code Playgroud)
但foo不存在。所以我从 pgAdmin 为 postgres 创建了数据库
CREATE DATABASE foo;
Run Code Online (Sandbox Code Playgroud)org.postgresql.util.PSQLException:致命:用户“postgres”的密码身份验证失败
spring.datasource.username= {DB USERNAME HERE}
spring.datasource.password= {DB PASSWORD HERE}
我有同样的问题。将此添加到 application.properties 解决了该问题:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 Spring Boot,则不需要显式提供 JPA 和 Hibernate 配置,因为 Spring Boot 可以为您完成。
在application.propertiesSpring Boot 配置文件中,您可以添加数据库配置属性:
spring.datasource.driverClassName = org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste
spring.datasource.username = klebermo
spring.datasource.password = 123
Run Code Online (Sandbox Code Playgroud)
并且,在同一个application.properties配置文件中,您还可以设置自定义 Hibernate 属性:
# Log SQL statements
spring.jpa.show-sql = false
# Hibernate ddl auto for generating the database schema
spring.jpa.hibernate.ddl-auto = create
# Hibernate database Dialect
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
Run Code Online (Sandbox Code Playgroud)
就是这样!
小智 5
在 jpa java config 的 spring boot 中,您需要扩展 JpaBaseConfiguration 并实现它的抽象方法。
@Configuration
public class JpaConfig extends JpaBaseConfiguration {
@Override
protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
return vendorAdapter;
}
@Override
protected Map<String, Object> getVendorProperties() {
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
269939 次 |
| 最近记录: |