本文介绍如何在使用springboot+jpa+hibernate的组合时,如何更加优雅的完成数据库设计,生成修改表的功能。
扫盲:
jpa是一套标准 springboot-jpa封装了javajpa标准并且抽象了常用的操作,但是并未实现这些标准,你可以采用hibernate、原始jdbc、mybits等rom方式实现。
说说重点,如何最优雅的完成数据库设计。
注意:5.7的mysql只支持d dl-auto 创建表,不支持update
一、必要的配置
spring:
jpa:
database: mysql
hibernate:
ddl-auto: update
二、实体类
@Data #lombok自动生成getset方法
@Builder #lombok自动生成builder方法支持流式写法 非必须
@NoArgsConstructor #lombok自动生成无参构造方法
@AllArgsConstructor #lombok自动生成全参构造方法
@Entity #javax实体声明
@Table(name = "wish", #javax声明对应的表名 这个是必须的
schema = "test_db" #javax声明对应的数据库名 非必须
indexes = {@Index(name = "user_no", columnList = "user_no")}, # javax声明索引 非必须
# javax声明聚合索引 非必须
uniqueConstraints = {@UniqueConstraint(name = "uniqueTest",columnNames = {"wish_no","channel"})})
@DynamicUpdate # hibernate声明动态生成update语句,提高效率使用 非必须
@DynamicInsert # hibernate声明动态生成insert语句,提高效率使用 非必须
public class Wish implements Serializable { # 好习惯 要序列化的对象实现序列化接口
@Id # javax声明主键id
@Column(name = "id", # javax声明列名,数据库要生成的字段
columnDefinition = "bigint(20) COMMENT 'ID,自增'") # javax声明列属性,字段的数据类型 说明等,这里可以直接当做sql创建语句自由增加
@GeneratedValue(strategy = GenerationType.IDENTITY) # javax声明主键生成策略
Long id;
@Column(name = "wish_no",
columnDefinition = ("varchar(18) COMMENT '心愿编号'"), unique = true)
String wishNo;
/**
* @see ChannelEnum
*/
@Column(name = "channel",
columnDefinition = ("varchar(10) DEFAULT 'ugc' COMMENT '心愿来源分类,ugc:用户上传,pgc:后台上传'"))
String channel;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@Column(name = "create_at",
columnDefinition = ("datetime COMMENT '创建时间'"))
Date createAt;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@Column(name = "update_at",
columnDefinition = ("datetime COMMENT '修改时间'"))
Date updateAt;
/**
* @see DeletedEnum
*/
@Column(name = "deleted",
columnDefinition = ("bigint(2) DEFAULT 0 COMMENT '是否逻辑删除,1:是,0:否'"))
Integer deleted;
}
三、继承的实体类
父类:
@MappedSuperclass # javax的这个注解
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseImageItem implements Serializable {
@Id
@Column(name = "id",
columnDefinition = "bigint(20) COMMENT 'ID,自增'")
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
/**
* @see com.fansunion.cloud.image.contants.ImageEnum
*/
@Column(name = "type",
columnDefinition = ("varchar(20) COMMENT '图片业务类型'"))
public String type;
}
子类:
@Entity
@Table(name = "image_item_coat", indexes = {@Index(name = "type", columnList = "type")})
@DynamicUpdate
@DynamicInsert
public class ImageItemCoat extends BaseImageItem {
}
注意:
1、@Table注解有非常多的功能,可以谷歌
2、spring.jpa.hibernate.ddl-auto 参数设置必须非常清楚其意义再使用,错误使用后果很严重。
3、父类@MappedSuperclass注解实现的是在每个子类中都创建父类的字段,符合我们传统的模式,还有其他注解来使用,不过意义不符合我们常规的需求,有兴趣的自己去了解
