spring-boot-starter-data-jpa
spring-boot-starter-data-jpa默认采用hibernate实现方式,这对于我们的单表操作,以及ORM逆向工程使用起来都特变方便,但是我们在通过实体类逆向生成数据库表的时候,可能会存在一点问题。
hibernate实体类逆向生成数据库表的问题
问题描述
当我在完成配置,建立好相关实体类,启动工程后我发现。hibernate除了为我们创建了实体类对应的数据库表还自动新建了hibernate_sequences表。
package com.itxiaoyuaiit.learnspringboot.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
/**
* @ClassName User
* @Description user实体
* @Author wuyuqing
* @Date 2020/8/23 20:04
* @Version 1.0
*/
@Entity
@Table(name = "user") //不指定name=user,默认创建的表名也是user
public class User {
@Id
@GeneratedValue
private Integer id;
private String name;
private Integer age;
private String job;
private Date birthday;
public User() {
}
public User(Integer id, String name, Integer age, String job, Date birthday) {
this.id = id;
this.name = name;
this.age = age;
this.job = job;
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/*****?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username: root
password: ******
jpa:
hibernate:
ddl-auto: create
show-sql: true
问题分析
打开@GeneratedValue源码会发现,该注解默认的属性值为strategy = GenerationType.AUTO,当我们在实体类Id字段中使用@GeneratedValue默认值实现主键自增时,hibernate在为我们创建实体表的同时,也会为我们创建一张hibernate_sequences序列表。
要想使用数据库引擎内部的自增机制,必须强制指定strategy = GenerationType.IDENTITY。
strategy的值可以为如下四种。
AUTO 主键由程序控制, 默认值
IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
SEQUENCE 通过数据库的序列产生主键, MYSQL不支持
Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植
问题处理
要想使用mysql内部的自增机制,我们只需指定@GeneratedValue(strategy = GenerationType.IDENTITY) 即可。当strategy = GenerationType.IDENTITY的时候hibernate在执行建表的时候,就会采用数据库内部的自增机制。