后端(6)-springboot连接阿里云RDS数据库

103 阅读3分钟

一、配置编译错误

下面原本配置是MySQL5Dialect,编译报错,改成下面的8Dialect即可。

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

二、数据库中group是保留关键字

不知道为什么sqlite3导出mysql后原本的groupName变成了group,在springboot中运行有报问题,查了下发现group是保留字段,所以想要访问RDS中已经有的group字段,就改为反引号``包裹group即可。

如下:

@Column(name = "`group`", nullable = false)
private String groupName; // 专辑所属分组

三、启动springboot连接RDS数据库后自动增加了下划线分隔的空字段

1、问题

每次启动都会发现报了几个错,然后看RDS中每张表里面原本用驼峰命名的字段就增加了一个下划线命名的字段。

比如:

Hibernate: alter table books add column audio_name varchar(255)
Hibernate: alter table books add column audio_url varchar(255)
Hibernate: alter table books add column cover_name varchar(255)
Hibernate: alter table books add column cover_url varchar(255)
Hibernate: alter table books add column album_id bigint not null
Hibernate: alter table pages add column page_id bigint not null auto_increment

2、原因

Spring Boot 中使用 JPA 时,实体类属性名与数据库表字段名之间默认存在一种映射规则,Hibernate 会根据命名策略将实体类属性名转换为数据库表字段名。

Hibernate 有默认的命名策略,在 Spring Boot 中,如果没有显式配置命名策略,Hibernate 会使用 SpringPhysicalNamingStrategy 作为物理命名策略。这个命名策略会将驼峰命名的 Java 属性名转换为下划线分隔的数据库字段名,例如 coverUrl 会被转换为 cover_urlcoverName 会被转换为 cover_name

3、解决方案

3.1、取消自动更新数据库字段

将配置中的spring.jpa.hibernate.ddl-auto=update改成spring.jpa.hibernate.ddl-auto=none,即不自动更新数据库表名。

spring.jpa.hibernate.ddl-auto设置为update时,Hibernate 会在应用启动时检查实体类的定义,并将数据库表结构与实体类的定义进行比较。如果发现实体类中定义了数据库表中不存在的字段,Hibernate 会自动生成 SQL 语句来添加这些字段。

3.2、增加JPA实体类中字段表名显示配置

然后在JPA实体类中对驼峰命名的列名,增加一个配置指定其数据库表中的列名也是驼峰命名。如下所示指定coverName在数据库表中的名称也是coverName

@Column(name = "coverName", nullable = false)
private String coverName; // 封面文件名
3.3、改了上述配置后查询数据库还是会报错

因为hibernate其他地方查询数据库时还是用的驼峰改下划线的命名转行UI则,所以会导致找不到数据库中的字段。 需要在application.properties中配置如下:

spring.jpa.hibernate.naming.physicalstrategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

PhysicalNamingStrategyStandardImpl 的具体规则

  • 直接映射PhysicalNamingStrategyStandardImpl 采用的是直接映射的方式,即直接使用实体类的类名作为数据库表名,使用实体类的属性名作为数据库列名,不会对命名进行额外的转换,例如不进行驼峰命名到下划线命名的转换。

四、数据库驱动版本

之前用的版本是:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>

新版本是:

<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>

应该用下面的新版本maven依赖。