Spring Data Jpa 自动生成表结构的方法示例

想在部署的时候随应用的启动而初始化数据脚本,这不就是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 设置主键策略,这里使用了Hibernate的UUID来生成主键;
  • @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等不必要的操作了,这两个接口的简单使用可以参考我的另外一篇文章。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Data JPA 建立表的联合主键

    最近遇到了一个小的问题,就是怎么使用 Spring Data JPA 建立表的联合主键?然后探索出了下面的两种方式. 第一种方式: 第一种方式是直接在类属性上面的两个字段都加上 @Id 注解,就像下面这样,给 stuNo 和 stuName 这两个字段加上联合主键: @Entity @Table(name = "student") public class Student { @Id @Column(name = "stu_no", nullable = false

  • Db2数据库中常见的堵塞问题分析与处理方法

    Db2 数据库堵塞怎么办 作为一个数据库管理员,工作中经常会遇到的一个问题:当数据库出现故障的情况下,如何快速定位问题和找到解决方案.尤其是在运维非常重要系统的时候,解决问题恢复服务是分秒必争.Db2 作为广泛使用的商业数据库,内部提供了众多方法论和诊断工具等来协助分析问题.然而当问题真正发生的时候,数据库管理员还是会手忙脚乱,不知道从何处下手.如果着手分析的方向发生了错误,时间更是浪费严重,问题得不到及时解决,甚至有可能采取了错误的措施,导致更严重的后果. 导致数据库堵塞原因有很多,即便是现在

  • Spring Boot中使用Spring-data-jpa的配置方法详解

    为了解决这些大量枯燥的数据操作语句,我们第一个想到的是使用ORM框架,比如:hibernate.通过整合Hibernate之后,我们以操作Java实体的方式最终将数据改变映射到数据库表中. 为了解决抽象各个Java实体基本的"增删改查"操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这样依然不是很方便,我们需要针对每个实体编写一个继承自泛型模板Dao的接口,再编写该接口的实现.虽然一些基础的数据访问已经可以得到很好的复用,但是在代码结构上针对每个实体都会有一堆Dao的

  • 详解Spring Data Jpa当属性为Null也更新的完美解决方案

    开场白 我本来是一名android开发者,突然就对java后端产生了浓烈的兴趣.所以,立马就转到了后端.第一个项目使用的使用Spring Data Jpa来操作数据库的,可是在更新数据的时候发现一个问题,属性值为Null竟然也更新,这就会导致本来没有更新的属性值,全部就成了Null. 原因 经过一番度娘操作,原来Jpa,不知道你是想把属性设置为Null,还是不想. 解决方法 找到一个方法,就是在数据模型上加上注解@DynamicUpdate,可是发现并不好使.而后经过整理,找到以下解决方案 我们

  • 实例讲解使用Spring通过JPA连接到Db2

    前提条件 Maven 一个拥有访问凭证的 Db2 实例: IBM Cloud 本地 Java JDK IBM Cloud 开发者工具(可选) 创建项目 首先,确定您计划使用 IBM Cloud 开发者工具还是 Spring Initializr 创建项目,然后按照各自的说明进行操作. IBM Cloud 开发者工具 如果您使用 IBM Cloud 开发者工具创建项目,那么使用 dev 插件创建新的 Spring 微服务. ibmcloud dev create 1.选择 Backend Serv

  • Spring Data Jpa 复合主键的实现

    前言 这次大创有个需求,在数据库建表时发现,user表与project表的关系表 user_project的主键为复合主键: CREATE TABLE user_project( user_id INT(20), project_id INT(20), timestamp VARCHAR (50), donate_money DOUBLE(10,2), PRIMARY KEY (user_id,project_id) ); 在网上看了几篇博客,以及在spring boot干货群咨询(感谢夜升额耐

  • 详解易语言链接DB2 OLEDB实例方法

    很多朋友在写易语言软件的时候需要用到链接DB2等内容,大家参阅下. 'database=rbsj:这是连数据库名,Hostname=PC-200806261910;"这是自己的计算机的名字, 如果真 (数据库连接.连接 ("Provider=IBMDADB2;database=rbsj;Hostname=PC-200806261910;")) sql = "SELECT * FROM ADMIN.RBSJ " .版本 2 .支持库 eDB .支持库 eGr

  • Spring Data Jpa 自动生成表结构的方法示例

    想在部署的时候随应用的启动而初始化数据脚本,这不就是Spring Data Jpa中的自动生成表结构,听起来特别简单,不就是配置Hibernate的ddl-auto嘛,有什么好说的,是个人都知道.当初我也是这样认为,实际操作了一把,虽然表是创建成功了,但是字段注释,字符集以及数据库引擎都不对,没想到在这些细节上翻车了. 毕竟开翻的车还要自己扶起来,于是在这记录一下. 注:本文中使用的Spring Data Jpa版本为2.1.4.RELEASE 以MySQL为例,我这边举个例子: import

  • Spring Data JPA 实现多表关联查询的示例代码

    多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果,这里介绍第二种方式. 一.一对一映射 实体 UserInfo :用户. 实体 Address:家庭住址. 这里通过外键的方式(一个实体通过外键关联到另一个实体的主键)来实现一对一关联. 实体类 1.实体类 UserInfo.java package com.johnfnash.learn.domain; import java.io.Ser

  • 详解Spring Data JPA中Repository的接口查询方法

    目录 1.查询方法定义详解 2.搜索查询策略 3.查询创建 4.属性表达式 5.特殊参数处理 6.限制查询结果 7. repository方法返回Collections or Iterables 8.repository方法处理Null 9.查询结果流 10.异步查询结果 1.查询方法定义详解 repository代理有两种方式从方法名中派生出特定存储查询. 通过直接从方法名派生查询. 通过使用一个手动定义的查询. 可用的选项取决于实际的商店.然而,必须有一个策略来决定创建什么实际的查询. 2.

  • Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例

    本博客介绍基于Spring Data这款orm框架加上 Jquery.pagination插件实现的分页功能. 本博客是基于一款正在开发中的github开源项目的,项目代码地址:https://github.com/u014427391/jeeplatform 欢迎star(收藏)或者可以下载去学习,还在开发- 介绍一下Spring Data框架 spring Data : Spring 的一个子项目.用于简化数据库访问,支持NoSQL 和 关系数据存储. 下面给出SpringData 项目所支

  • 通过npm或yarn自动生成vue组件的方法示例

    不知道大家每次新建组件的时候,是不是都要创建一个目录,然后新增一个.vue文件,然后写template.script.style这些东西,如果是公共组件,是不是还要新建一个index.js用来导出vue组件.虽然有vscode有代码片段能实现自动补全,但还是很麻烦,今天灵活运用scripts工作流,自动生成vue文件和目录. 实践步骤 安装一下chalk,这个插件能让我们的控制台输出语句有各种颜色区分 npm install chalk --save-dev yarn add chalk --s

  • python自动生成证件号的方法示例

    前言 在跟进需求的时候,往往涉及到测试,特别是需要用到身份信息的时候,总绕不开身份证号码这个话题.之前在跟一个互联网产品的时候,需要很多身份证做测试,又不想装太多软件自动生成(有需要的小伙伴可自行搜索身份证号码自动生成软件),按照身份证规则现编也比较浪费时间,在处理身份数据时,Python就非常有用了. 方法示例如下 # Author:BeeLe # -*-coding:utf-8-*- # 生成身份证号码主程序 import urllib.request import requests fro

  • Spring Data Jpa的四种查询方式详解

    这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> 使用这

  • spring data jpa 创建方法名进行简单查询方式

    目录 最常见的做法是 按照规范创建查询方法 支持的规范表达式 spring data jpa 可以通过在接口中按照规定语法创建一个方法进行查询,spring data jpa 基础接口中,如CrudRepository中findOne,save,delete等,那么我们自己怎么按照需要创建一个方法进行查询呢? 最常见的做法是 声明一个接口继承于CrudRepository 或者 PagingAndSortingRepository,JpaRepository,Repository public

  • spring data jpa查询一个实体类的部分属性方式

    目录 springdatajpa查询一个实体类的部分属性 首先我们定义两个实体类 然后创建person实体类的repository 返回结果只包含firstName和lastName两个属性 springdatajpa查询部分字段.多余附加字段 第一种方法:使用model查询时转化 第二种方法:在service里边转换成JSON 第三种方法:select语句部分字段使用默认值 spring data jpa查询一个实体类的部分属性 使用Spring Data Repository查询时候,通常情

  • 解决Spring Data Jpa 实体类自动创建数据库表失败问题

    目录 Spring Data Jpa 实体类自动创建数据库表失败 找了半天发现是一个配置的问题 可能导致JPA 无法自动建表的问题汇总 1.没加@Entity或引错Entity所在包 2.jpa配置中ddl-auto未设置update 3.实体类的包不是启动程序所在包的子包 4.mysql配置问题 5.依赖不全 6.实体类间关系错误 7.启动类注解问题 8.其他问题 Spring Data Jpa 实体类自动创建数据库表失败 先说一下我遇到的这个问题,首先我是通过maven创建了一个spring

随机推荐