前情提要,jdk版本1.8
首先讲讲我的报错吧
正常springboot-jpa链接数据库只需要JDBC,JPA,对应的数据库驱动依赖就行了。我一开始也是这么想的。下面是我的辛酸史!
首先华为云云端提供了DAS服务可以通过和链接postgresql一样的方式去链接它的openGauss。并且华为云提供了postgresql的jdbc驱动程序。所以理论上,springboot是可以链接华为GaussDB(for openGauss)。
华为云jdbc驱动包如下
单纯只是jdbc链接的话可以参考我这一篇博客
首先我在IDEA新建一个springboot的项目,我勾选了spring web,spring jpa,spring postgresql,spring jdbc的依赖。然后把华为云提供的jdbc的驱动包导入到项目中,不会导入看我上面的一篇博客,进入项目中,我的pom.xml配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo1</name>
<description>demo1</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
理所当然没什么错
然后配置application.properties,看起来没什么问题
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://121.36.92.254:8000/lmx?currentSchema=root
spring.datasource.username=root
spring.datasource.password=Zz457178918
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
server.port=8080
运行报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
然后看网上的解释是要配置文件加上这样一句,指明jpa的database
spring.jpa.database=postgresql
加完之后有报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
再查查说是要加这个
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
都改完了之后,大的来了,报这个错,这我就摸不清了啊
org.postgresql.util.PSQLException: Invalid or unsupported by client SCRAM mechanisms
上华为云查了一下还真有这个的纠错,脑补一下
你应该知道的数仓安全——安全认证-云社区-华为云安全认证是识别用户身份并允许用户登录的过程,是用户使用数据库的第一步。用户可以通过口令认证、LDAP认证、IAM认证等方式实现身份认证并登录数据库。介绍了...https://bbs.huaweicloud.com/blogs/249702他给了纠错链接,但是404,我真的tm!
然后就一直卡着,不会啊这个SCRAM协议。
然后看报错是我忽然发现他报的错不是来自于华为云给的jdbc得那个jar包
它来自于我导入得官方给的 postgresql得jar包依赖得报错。到这里我豁然开朗,我既然有了华为的postgresql得jdbc驱动,为啥还要导入spring官方给的呢?我是猪@_@
下面是正确的链接方式
正解
新建springboot项目,勾选了spring web,spring jpa,spring jdbc的依赖。切记不要用官方给的
postgresql的依赖
你的pom.xml文件应该长这样
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo2</name>
<description>demo2</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
导入之前华为云给的jdbc的驱动包
配置applications.propertites
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://121.36.92.254:8000/lmx?currentSchema=root
spring.datasource.username=root
spring.datasource.password=Zz457178918
spring.jpa.database=postgresql
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
server.port=8080
简单写一个测试类
import org.hibernate.annotations.Proxy;
import javax.persistence.*;
import java.sql.Date;
@Proxy(lazy = false)
@Entity
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue
private Long id;
private String nickname;
private String username;
private String password;
private String email;
private String avatar;
private Integer type;
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", nickname='" + nickname + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", avatar='" + avatar + '\'' +
", type=" + type +
'}';
}
public void setId(Long id) {
this.id = id;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setEmail(String email) {
this.email = email;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public void setType(Integer type) {
this.type = type;
}
public Long getId() {
return id;
}
public String getNickname() {
return nickname;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getEmail() {
return email;
}
public String getAvatar() {
return avatar;
}
public Integer getType() {
return type;
}
}
连接正常,完全跑通,通过jpa新建的t_user也是有的