Spring Data JPA 数据初始化
Spring Data JPA 数据初始化
知识铺垫
基础原理
Dante Cloud 核心数据访问层使用 Spring Boot 生态中的spring-boot-starter-data-jpa
组件,spring-boot-starter-data-jpa
核心依赖是 Spring Data JPA
。
JPA
(Java Persistence API
)意即 Java 持久化 API,是 Sun 官方在 JDK5.0 后提出的 Java 持久化规范。Spring Data JPA
默认使用 Hibernate
作为 JPA
实现。参阅:Spring Data JPA
Spring Data JPA
利用 Hibernate
多数据库支持能力实现不同类型数据库的支持,同时使用 Hibernate
的 hbm2ddl
机制 实现数据库表的自动创建。除此以外,Spring Data JPA
提供了数据库 SQL 脚本自动执行机制,实现了数据脚本的初始化和表结构等创建功能。
Spring Data JPA 更换数据库
通过修改spring-boot-starter-data-jpa
对应的配置参数就可以达成更换数据库的目的。主要涉及需要修改的配置参数如下表所示:
配置 | 说明 |
---|---|
spring.datasource.driver-class-name | 数据库 Driver Class,不同的数据库驱动不同 |
spring.datasource.url | 数据库访问连接,不同数据连接格式也不同 |
spring.datasource.username | 数据库访问用户名,如果相同可以不用修改 |
spring.datasource.password | 数据库访问密码,如果相同可以不用修改 |
spring.jpa.database | 选择数据库类型,具体类型与枚举org.springframework.orm.jpa.vendor.Database 中的值对应,使用小写值即可 |
spring.jpa.properties.hibernate.dialect | 选择数据库类型对应的 dialect,在 org.hibernate.dialect 包下可以找到具体数据库对应的 dialect |
spring.jpa.hibernate.ddl-auto | 设置 hibernate 初始化操作的类型,具体参见下表 |
这里要特别注意 spring.jpa.hibernate.ddl-auto
参数。
spring.jpa.hibernate.ddl-auto
参数包含以下几个值,具体含义见下表:
属性 | 说明 |
---|---|
create | 每次加载 hibernate 时都会删除上一次的生成的表,再重新根据 model(与数据库表对应的实体)生成表,因此可能会导致数据丢失。 |
create-drop | 每次加载 hibernate 时根据 model 类生成表,服务一关闭,表就自动删除。该设置适用于演示环境等特殊场景使用 |
update | 最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构,再次使用时自动更新表结构,原有数据不会清空。 |
validate | 每次加载 hibernate 时,会校验数据与数据库的字段类型是否相同,字段不同会报错。 |
none | 不进行任何操作 |
如果想要使用spring-boot-starter-data-jpa
提供 SQL 自动初始化机制,那么还需要额外修改以下配置:
通过以上配置参数的修改就可以进行数据库的切换,以及数据库表的创建.
Spring Data JPA 初始化数据库
Spring Data JPA
还提供的数据库 SQL 脚本的执行机制。将已生成好的数据库 SQL 脚本,放入到代码工程的resources
目录下,按照指定格式命名,通过修改配置就可以实现 SQL 脚本的自动执行。
具体 SQL 文件名的格式为:schema-${platform}.sql
和 data-${platform}.sql
。platform
是用来指定不同的数据库类型,以此来实现不同数据库脚本的切换。
schema-${platform}.sql
:主要放置数据库定义语言(DDL
)SQL 脚本,例如:数据库表,视图,存储过程等。data-${platform}.sql
:主要放置数据操纵语言(DML
)SQL 脚本,例如:最经常用到的 SELECT,UPDATE,INSERT,DELETE。
由此可见,
schema-${platform}.sql
是先于data-${platform}.sql
执行的。
主要涉及需要修改的配置参数如下表所示:
配置 | 说明 |
---|---|
spring.sql.init.mode | 用于控制脚本执行状态。 |
spring.sql.init.platform | 数据库类型,主要用于在 data-locations 和 schema-locations 中定位不同数据库的脚本 |
spring.sql.init.data-locations | DML SQL 文件路径 |
spring.sql.init.data-locations | DDL SQL 文件路径 |
这里要特别注意 spring.sql.init.mode
参数。
spring.sql.init.mode
参数包含以下几个值,具体含义见下表:
属性 | 说明 |
---|---|
always | 总是执行,相当于开启 |
never | 不执行,相当于关闭 |
embedded | 仅初始化嵌入式数据库,特殊需求和设计会用到 |
特别说明
::: danger 警告
Spring Data JPA
既可以通过 Hibernate
的机制进行数据库表的创建,也可以通过sql.init
的方式进行数据库表以及数据初始化的创建。这两者是各自独立的,没有任何必然联系的。具体如何使用就要看设计者的考虑。
两者的执行顺序不同,如果要两者同时使用一定要注意执行顺序,否则很容易导致运行出错。具体的顺序是:
schema-${platform}.sql
> data-${platform}.sql
> hbm2ddl
。
:::