Spring Data Jpa 自动生成表结构

栏目: Java · 发布时间: 6年前

内容简介:想在部署的时候随应用的启动而初始化数据脚本,这不就是毕竟开翻的车还要自己扶起来,于是在这记录一下。注:本文中使用的

想在部署的时候随应用的启动而初始化数据脚本,这不就是 Spring Data Jpa 中的自动生成表结构,听起来特别简单,不就是配置 Hibernateddl-auto 嘛,有什么好说的,是个人都知道。当初我也是这样认为,实际操作了一把,虽然表是创建成功了,但是字段注释,字符集以及数据库引擎都不对,没想到在这些细节上翻车了。

毕竟开翻的车还要自己扶起来,于是在这记录一下。

注:本文中使用的 Spring Data Jpa 版本为 2.1.4.RELEASE

MySQL 为例,我这边举个例子:

import com.fasterxml.jackson.annotation.*;
import org.hibernate.annotations.*;
import org.springframework.data.annotation.*;

import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.math.BigDecimal;

@Entity
@javax.persistence.Table(name = "basic_city")
@org.hibernate.annotations.Table(appliesTo = "basic_city", comment = "城市基本信息")
public class CityDO {
    
    @Id
    @GenericGenerator(name = "idGenerator", strategy = "uuid")
    @GeneratedValue(generator = "idGenerator")
    @Column(name = "CITY_ID", length = 32)
    private String cityId;
 
    @Column(name = "CITY_NAME_CN", columnDefinition = "VARCHAR(255) NOT NULL COMMENT '名称(中文)'")
    private String cityNameCN;
    
    @Column(name = "CITY_NAME_EN", columnDefinition = "VARCHAR(255) NOT NULL COMMENT '名称(英文)'")
    private String cityNameEN;

    @Column(name = "LONGITUDE", precision = 10, scale = 7)
    private BigDecimal longitude;

    @Column(name = "LATITUDE", precision = 10, scale = 7)
    private BigDecimal latitude;

    @Column(name = "ELEVATION", precision = 5)
    private Integer elevation;

    @Column(name = "CITY_DESCRIPTION", length = 500)
    private String cityDescription;
    
    // 构造方法及get/set方法省略
}
  • @javax.persistence.Table 修改默认 ORM 规则,属性 name 设置表名;
  • @org.hibernate.annotations.Table 建表时的描述, 属性 comment 修改表描述;
  • @Id 主键
  • @GenericGenerator 设置主键策略,这里使用了 HibernateUUID 来生成主键;
  • @GeneratedValue 设置主键值,属性 generator 关联主键策略的 name
  • @Column 修改默认 ORM 规则;
    name 设置表中字段名称,表字段和实体类属性相同,则该属性可不写;
    unique 设置该字段在表中是否唯一,默认 false
    nullable 是否可为空,默认 true
    insertable 表示 insert 操作时该字段是否响应写入,默认为 true
    updatable 表示 update 操作时该字段是否响应修改,默认为 true
    columnDefinition 是自定义字段,可以用这个属性来设置字段的注释;
    table 表示当映射多个表时,指定表的表中的字段,默认值为主表的表名;
    length 是长度,仅对 varchar 类型的字段生效,默认长度为255;
    precision 表示一共多少位;
    scale 表示小数部分占 precision 总位数的多少位,例子中两者共同使用来确保经纬度的精度;

接下来需要设置数据引擎和字符集,网上大把的继承 MySQL5InnoDBDialect ,但是这个类已经过期了,我们用 MySQL5Dialect 来代替:

package com.jason.config;

import org.hibernate.dialect.MySQL5Dialect;
import org.springframework.stereotype.Component;

@Component
public class MySQL5TableType extends MySQL5Dialect {

    @Override
    public String getTableTypeString() {
        return "ENGINE=InnoDB DEFAULT CHARSET=utf8";
    }
}

然后在 Spring Boot 的配置文件中应用上面定义的 MySQL5TableType ,使用 spring.jpa.properties.hibernate.dialect 配置:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/techno?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    properties:
      hibernate:
        dialect: com.jason.config.MySQL5TableType

到此, Sprign Data Jpa 生成表就完成了,应用就可以通过 ApplicaitonRunner 或者 CommandLineRunner 接口一键部署应用,省去初始化 SQL 等不必要的操作了,这两个接口的简单使用可以参考我的另外一篇文章。

原创不易,感谢支持。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Coding the Matrix

Coding the Matrix

Philip N. Klein / Newtonian Press / 2013-7-26 / $35.00

An engaging introduction to vectors and matrices and the algorithms that operate on them, intended for the student who knows how to program. Mathematical concepts and computational problems are motiva......一起来看看 《Coding the Matrix》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换