SpringBoot spring-data-jpa表的生成
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
根据实体类生成对应表
- 引用jar包
- 配置文件
- 创建实体
- 单表创建
- 关联表创建
- 多对多表的创建
- 一对一关联表的创建,以及一对多关联表的创建
引用jar包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency>
配置文件
# 数据库的基本配置
spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8type: com.alibaba.druid.pool.DruidDataSource# JPA配置jpa:database: mysql# 在控制台打印SQLshow-sql: true# 数据库平台database-platform: mysql# 每次启动项目时,数据库初始化策略hibernate:ddl-auto: update# 指定默认的存储引擎为InnoDB,默认不指定的话使用的数据库引擎为mySAM,# mysqlConfig重写org.hibernate.dialect.MySQL57Dialect的getTableTypeString方法修改字符集为utf-8properties:hibernate:dialect: com.example.jpa.config.MysqlConfig
server:port: 8083
com.example.jpa.config.MysqlConfig
上面这个是自定义的类的路径,解决生成表时,标的字段文本类型默认不是utf-8的问题,代码如下
public class MysqlConfig extends MySQL57Dialect {@Overridepublic String getTableTypeString() {return " ENGINE=InnoDB DEFAULT CHARSET=utf8";}}
创建实体
单表创建
@Entity注解 在类上使用,表明是实体,会在数据库创建对应表。
@Id注解 一定要加,否则会报错找不到主键
@GeneratedValue这个是指定主键生成策略strategy = GenerationType.IDENTITY为主键自增
@Colum 可加可不加,主要是用来类的属性做一些定制,可以通过指定name来改变生成表的属性名,默认采用驼峰命名规则。nullable设置为false不为空。columnDefinition可以用来改变表字段的相应属性,值与sql语句声明相同,例如:varchar(100) default ‘’ comment ‘我是字段注释…’
表示字段类型为varchar 长度为100 默认空串注释为我是字段注释
如果想要加表注释就得使用@org.hibernate.annotations.Table注解appliesTo表示应用的表,必填
comment是注释。
基于此单表已经可以使实现创建了,下面的例子
@Data
@Entity(name="sys_user")
@ToString
//@org.hibernate.annotations.Table(appliesTo = "user",comment="用户")
public class User{@Id@Column(name="user_id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String username;@Column(nullable = false)private String nickName;}
关联表创建
多对多表的创建
@ManyToMany 里面的targetEntity指定关联的对象,不包括中间表。cascade 指定当前表拥有的权限,值有
CascadeType.cascade 赋予增加role的权限CascadeType.ALL, 所有权限CascadeType.PERSIST, 新增操作权限 没有权限,当保存user时无法保存role并且会报错CascadeType.MERGE, 更新CascadeType.REMOVE, 删除CascadeType.REFRESH, 假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存CascadeType. DETACH; 想删除某个实体但是他有外建无法删除,会撤销外键
@JoinTable 通过name来指定中间表的名称,不指定则默认创建,通过joincolumn来指定当前表的关联,joincolumn={@JoinColumn(name="",referenceColumn="")},其中name是当前表的关联字段,referenceColumn是中间表的字段。示例:
@Id@Column(name="user_id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(columnDefinition = "text",nullable = false)private String username;@Column(columnDefinition = "text",nullable = false)private String nickName;@ManyToMany(targetEntity = Role.class,cascade = CascadeType.PERSIST)@JoinTable(name = "user_role_link",joinColumns ={@JoinColumn(name="user_id",referencedColumnName = "user_id")},inverseJoinColumns = {@JoinColumn(name="role_id",referencedColumnName = "role_id")})private List<Role> roles;
@Data
@Entity(name="sys_role")
public class Role {@Id@Column(name="role_id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(columnDefinition = "text",nullable = false)private String roleName;/* @ManyToMany(targetEntity = User.class)@JoinTable(name="user_role_link",//本表指向joinColumns ={@JoinColumn(name="role_id",referencedColumnName = "role_id")},//关联表指向inverseJoinColumns = {@JoinColumn(name="user_id",referencedColumnName = "user_id")})@JsonIgnoreprivate List<User> users;*/
}
可以看到role类里的我是注释掉的
如果在查role的时候一定要查找user,那么则需要加上注解,规则同上,但是最后一定要加一个@JsonIgnore注解,否则汇报错,大致原因就是循环解析
多对多还可已通过创建三个单表来实现。这样可以避免外键的关联
一对一关联表的创建,以及一对多关联表的创建
@OneToOne 指定tagertEntity,根据业务配置cascade的值
@joinColumn name值为当前表关联其他标的字段名称,refenrenceColumn关联的他表字段
这样就可已配置完成了。注意:被关联表的外键是不用显示在实体类的,生成表时会自动创建
如果关联的两表的都需要用有对方的实体。那么都需要使用@joinColumn,这样就需要使用@jsonignore注解否则会循环
示例:
@Entity
@Data
public class Person {@Id@Column(name="person_id")@GeneratedValue(strategy= GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String name;@OneToOne(targetEntity = Book.class)@JoinColumn(name="person_id",referencedColumnName = "person_id")private Book book;
}
@Data
@Entity
@org.hibernate.annotations.Table(appliesTo = "book",comment="我会有表注释的哟...")
public class Book {@Id@GeneratedValue(strategy= GenerationType.IDENTITY)@Column(name="book_id")private Long id;@Column(nullable = false,columnDefinition = "varchar(100) default '' comment '我是字段注释...'")private String name;/* @OneToOne(targetEntity = Person.class)@JoinColumn(name="person_id",referencedColumnName = "person_id")@JsonIgnoreprivate Person person;*/
}
一对多同一对一用法类似,把@OneToOne的注解换成@OneToMany或者@ManyToOne
就好,注意一对多中的一使用@OneToMany,多使用@ManyToOne
SpringBoot spring-data-jpa表的生成相关推荐
- 基于SpringBoot+ Spring Data Jpa的后台管理系统【源码开源】
昨天朋友找我喝酒,说30岁了,比较焦虑,钱没赚到,整天被媳妇数落. 其实现在我们看到的不一定就事真实的情况,就算从高斯分布看,平平淡淡的人生才是大部分人的轨迹.当然抖音.知乎上的不能比,人均收入百万, ...
- SpringBoot + Spring data JPA使用方言(自定义函数、一些自带函数)
本人之前一直用mybitis,现在项目上使用jpa,给我带来了极大的方便,但也遇到一些问题.下列需求是这样的,我要根据id in 筛选出符合条件的数据,并将其中的某个字段,拼接起来返回.用原生sql比 ...
- spring-boot (三) spring data jpa
学习文章来自:http://www.ityouknow.com/spring-boot.html spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence ...
- SpringBoot集成Spring Data JPA多数据源(二)
目录 1.引入依赖 2.application.yml配置文件 3.AtomikosJtaPlatform 4.事务管理器JPAAtomikosTransactionConfig 5.主数据源配置 6 ...
- Spring Boot(五):spring data jpa的使用
Spring Boot(五):spring data jpa的使用 一.spring data jpa介绍 1,JPA是什么 JPA(Java Persistence API)是Sun官方提出的Jav ...
- Spring boot (5):Spring data jpa 的使用
总结: jpa是什么,spring data jpa是什么? jpa是一套规范,不是一套产品.jpa是一套规范,不是一套产品. spring data jpa是spring基于ORM框架.JPA规范的 ...
- 具有中央异常处理和VO验证的Spring Data JPA –框架
1.简介 一段时间以来,Spring框架已成为事实上的标准,可以创建任何基于REST API的应用程序. Spring提供了各种现成的组件,以避免编写重复而繁琐的样板代码. 另外,关于Spring的美 ...
- SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spri ...
- 第九章SpringBoot整合Spring Data JPA
目录 1 概述 2 Spring Data JPA整合 2.1 pom文件 2.2 配置文件 2.3 实体类 2.4 Dao接口 2.5 启动类 2.6 编写测试类 3 Spring Data JPA ...
- 【SpringBoot框架篇】11.Spring Data Jpa实战
文章目录 1.简介 1.1.JPA 1.2.Spring Data Jpa 1.3.Hibernate 1.4.Jpa.Spring Data Jpa.Hibernate三者之间的关系 2.引入依赖 ...
最新文章
- 本地计算机用户改名,win10本地账户管理员怎么改名,详细操作步骤请看本篇
- linux桌面旋转了180度,[多图]回顾每一款默认Ubuntu壁纸
- Java集合系列---ConcurrentHashMap源码解析
- 12-Juice饮料
- Eve-NG-Toolkit
- 苹果官网下架 iPhone 8 全系;阿里推出“阿里云会议”;深度操作系统 20 BETA 发布 | 极客头条...
- dubbo调用服务出现如下异常
- python json格式和csv文件转换
- 统计学习(一):数据的组织和表示
- C# ADO.NET中设置Like模糊查询
- 噇字符集linux,gbk编码
- 2012-11-21nbsp;09:30nbsp;NSStr…
- 英文对“ Big O”符号的解释是什么?
- DIY个性家装心得家用电动工具选择
- 安卓view.getMeasuredHeight()得到的高度单位以及dp和px的转换
- MAC的delete键与Windows的对应关系
- 可汗学院公开课:线性代数笔记-10-三元线性方程
- Nginx subs_filter模块替换文本
- 创业公司第三方服务精选(移动互联网版)
- RS485 通信电路 PCB