在Spring Boot中使用JPA进行开发时,可以通过使用Hibernate的hbm2ddl自动生成数据库表。在生成表之后,如果对实体类进行了更改,比如增加或修改了字段,当再次运行应用程序时,Hibernate并不会根据实体类的更改来更新数据库中的表结构,导致无法使用新的字段。为了解决这个问题,我们需要对Spring Boot的自动建表进行配置。
步骤如下:
1. 禁用自动建表
在Spring Boot的配置文件application.properties或application.yml中,设置jpa.hibernate.ddl-auto属性为none,来禁用自动建表功能。这样,在程序启动时Hibernate就不会去更新表结构了。
spring:
jpa:
hibernate:
ddl-auto: none
2. 使用Flyway管理数据库迁移
Flyway是一个开源的数据库迁移工具,可以与Spring Boot无缝集成,使用Flyway可以管理所有的数据库变更,包括表结构、数据、存储过程等。在Spring Boot中,只需要添加相关的依赖和配置即可完成集成。
添加依赖
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.5</version>
</dependency>
配置
在Spring Boot的配置文件application.properties或application.yml中,添加以下配置项:
# 数据库连接配置
spring.datasource.url= jdbc:mysql://localhost:3306/db_example
spring.datasource.username= dbuser
spring.datasource.password= dbpass
# Flyway配置
flyway.baseline-on-migrate = true
flyway.locations = classpath:db/migration
flyway.schemas = public
其中,flyway.locations属性指定Flyway迁移脚本所在的目录,默认是src/main/resources/db/migration,可以通过classpath:db/migration来指定。
编写迁移脚本
在项目的resources/db/migration目录下,添加一个V1__init.sql文件,内容如下:
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) DEFAULT NULL,
`password` VARCHAR(50) DEFAULT NULL,
`email` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES (1,'admin','admin','admin@example.com');
这个脚本用来创建一个名为user的表,并插入一条数据。
往user表中新增一个字段,可以添加一个V2__add_column.sql文件,内容如下:
ALTER TABLE `user` ADD COLUMN `enabled` TINYINT(1) NOT NULL DEFAULT 1;
这个脚本用来在user表中新增一个名为enabled的字段,并设置默认值为1。
到这里,整个配置就完成了。当程序启动时,Flyway会自动执行迁移脚本。
参考示例:
以下是一个简单的示例项目,演示如何使用Flyway管理数据库迁移(使用MySQL数据库)。
该项目中使用了两个迁移脚本,V1__init.sql用来创建user表,V2__add_column.sql用来新增一个enabled字段。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot中关于自动建表,无法更新字段的问题 - Python技术站