springboot-jpa之hibernate优雅注解

本文详述如何在SpringBoot项目中,利用JPA与Hibernate优雅地进行数据库设计及表生成更新,包括配置详解、实体类定义技巧及继承实体类的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍如何在使用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注解实现的是在每个子类中都创建父类的字段,符合我们传统的模式,还有其他注解来使用,不过意义不符合我们常规的需求,有兴趣的自己去了解

欢迎关注我的个人公众号
欢迎关注我的个人公众号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值