Spring Data JPA 数据初始化

码匠君大约 4 分钟

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 多数据库支持能力实现不同类型数据库的支持,同时使用 Hibernatehbm2ddl 机制 实现数据库表的自动创建。除此以外,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}.sqldata-${platform}.sqlplatform 是用来指定不同的数据库类型,以此来实现不同数据库脚本的切换。

  • 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-locationsDML SQL 文件路径
spring.sql.init.data-locationsDDL SQL 文件路径

这里要特别注意 spring.sql.init.mode 参数。

spring.sql.init.mode 参数包含以下几个值,具体含义见下表:

属性说明
always总是执行,相当于开启
never不执行,相当于关闭
embedded仅初始化嵌入式数据库,特殊需求和设计会用到

特别说明

警告

Spring Data JPA 既可以通过 Hibernate 的机制进行数据库表的创建,也可以通过sql.init的方式进行数据库表以及数据初始化的创建。这两者是各自独立的,没有任何必然联系的。具体如何使用就要看设计者的考虑。

两者的执行顺序不同,如果要两者同时使用一定要注意执行顺序,否则很容易导致运行出错。具体的顺序是:

schema-${platform}.sql > data-${platform}.sql > hbm2ddl