jeecg boot一对多新增的附表不会主键是一个string_测试开发专题:spring-boot如何使用JPA进行双向一对多配置...

本片文章我们主要介绍spring-boot如何进行JPA的配置以及如何进行实体间的一对多配置。

依赖准备

要在spring-boot使用jpa需要在项目中有进入相关的依赖,pom文件里加入下面内容

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

项目的配置文件中需要对数据库链接以及jpa进行配置:

spring:datasource:url: jdbc:mysql://localhost:3306/missyou?characterEncoding=utf-8&serverTimezone=GMT%2B8username: rootpassword: 12345678jpa:hibernate:ddl-auto: update # 只针对新增的entity创建表properties:hibernate:show_sql: true  # 在对数据库进行操作的时候打印出sql,方便在生产环境排查问题format_sql: true  # 打印sql的时候进行格式化,看起来方便

jpa实战

  • 一对多关系

先定义两个实体类Banner和BannerItem,一个Banner可以对应多个BannerItem,属于典型的一对多的关系

@Entity
public class Banner {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;@Column(length = 16)private String name;@Transient  // 表明这个字段不会映射到表中的字段private String description;private String img;private String title;@OneToManyprivate List<BannerItem> items;  // 关联属性,导航属性}
@Entity
public class BannerItem {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String img;private String keyword;private Short type;private String name;
}

先对上面代码中的一些注解进行说明:

@Entity标记当前类为一个实体,对应数据库中的一张表,用来表示这张表信息,类名默认就是表名,jpa会根据命名规则自动小写并加下划线,比如BannerItem实体,生成的表名就是banner_item

@Id表名标记的字段将作为主键

@GeneratedValue(strategy = GenerationType.IDENTITY) 设置id为自增长

@Column(length = 16) 设置字段的属性,比如长度、是否为空、是否唯一等

@OneToMany可以使用两个实体建立一对多的关系,也就是一个Banner可以包含多个BannerItem

@Transient注解表示被标记的当前字段不会映射到数据库表的字段,也就是说生成的表中不会包含这个字段

此时运行程序,就会在数据库中创建对应的表:

9fced7373f4927fbb1749b3624f74cf4.png

这里生成了三张表,banner表和banner_item表我们知道是对应的Banner实体和BannerItem实体,那banner_items这张表是怎么回事呢?

在解释这张表之前,我们先来看一下这个表的结构:

f006d953a0af80f6f76bdfd382f9964a.png

表里只有两个字段,banner_id和items_id,分别是banner的id和banner_item的id,这就是说这张表相当于一张关系表,在多对多的时候我们才需要一张关系表,而现在只是一对多,为什么会产生这张表呢?

这是因为在上面的实体定义的时候,我们只是给这两个实体建立了关系,并没有任何一个字段来表明哪一个BannerItem属于哪一个Banner,那JPA看到你没有做,那就我来做,他会自动帮你创建这样一张关系表来维护这种归属关系。那有没有办法去掉这张表呢,当然有。

这个时候就需要新增一个外键字段了,来表明一个banner_item到底是归属于哪一个banner,我们来修改一下上面的实体定义:

Banner实体里做如下修改:

@OneToMany
@JoinColumn(name = "bannerId")
private List<BannerItem> items; 

@JoinColumn注解指定外键

BannerItem实体增加一个字段:bannerId

private Long bannerId;

删除之前的表,重新运行程序

71c23a5a517c62173b12ce7c98b965a5.png

这个时候生成的表就只有两个了,在banner_item表里会新增一个外键字段。

下面我们通过一个程序实例来验证上面的内容:

1、构造数据

表结构已经构造好了,现在我们填充一些数据,来使用JPA进行数据查询

INSERT INTO missyou.banner (id, img, name, title) VALUES (1, 'http://sss.jpg', '顶部banner', '顶部banner');
INSERT INTO missyou.banner (id, img, name, title) VALUES (2, 'http://aaa.jpg', '顶部banner2', '顶部banner2');INSERT INTO missyou.banner_item (id, banner_id, img, keyword, name, type) VALUES (1, 1, 'http://www.jpj', '衣服', '阿迪促销', 1);
INSERT INTO missyou.banner_item (id, banner_id, img, keyword, name, type) VALUES (2, 1, 'http://www.jpj', '鞋', '阿迪促销', 1);

2、新建Controllerservicerepository

BannerRepository仓储层,主要负责读取数据库

@Repository
public interface BannerRepository extends JpaRepository<Banner, Long> {Banner findOneById(Long id);Banner findOneByName(String name);
}

sevice层,具体的业务逻辑

@Service
public class BannerServiceImpl implements BannerService{@Autowiredprivate BannerRepository bannerRepository;@Overridepublic Banner getByName(String name) {return bannerRepository.findOneByName(name);}
}

controller层,负责接收客户端请求返回数据

@GetMapping("/banner/name/{name}")
public Banner getBannerByName(@PathVariable String name){return bannerService.getByName(name);
}

请求接口:

a4a0ef87a2258cb6f3e9206fbc18d8a1.png

可以看到数据已经查询出来了。

  • 双向一对多

上面的示例是根据banner_id去查关联的一组banner_item,但是有些场景我们可能需要通过某个item_id去查是属于哪个banner,那这就是一种的反向的一对多,接下来我们看一下这总反向的一对多如何配置。

我们之前配置了一个items属性

@OneToMany
@JoinColumn(name = "bannerId")
private List<BannerItem> items; 

这个属性就可以帮我们定位到某个banenr关联的一组bannerItem,可以叫做导航属性,那么反过来,如何从一个item定位到一个Banner,怎么设置导航属性?

首先需要在BannerItem实体类里面增加一个banner属性,并使用如下注解进行标记

@ManyToOne
@JoinColumn(name = "bannerId")
private Banner banner;

修改Banner实体

@OneToMany(mappedBy = "banner")
private List<BannerItem> items;

这里其实就是把@JoinColumn(name = "bannerId")移动到BannerItem里面。并且在BanenrItem里要删除掉之前定义的外键字段bannerId。

这是因为在设置双向一对多的关系时,会默认在banner_item表里生成一个外键,如果自己再写一个就会造成重复,程序就会报错。

那如果自己很想指定,也可以,进行如下配置

@ManyToOne
@JoinColumn(insertable = false, updatable = false, name = "bannerId")
private Banner banner;

总结

以上就是我们介绍的关于在spring-boot中如何进行实体间的单向一对多和双向一对多的配置,关于要在实际项目如何使用哪一种方式,还是要结合自己的业务,一般不需要进行双向的配置,而且一般都不会去设置物理外键,后面我们再讨论如何进行多对多的配置以及如何去除物理外键。

欢迎大家去 我的博客 瞅瞅,里面有更多关于测试实战的内容哦!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘阿里机器翻译团队:拿下5项全球冠军,每天帮商家翻译7.5亿次

摘要&#xff1a; 跨境电商市场越来越大&#xff0c;商家们也遇到了新问题。以阿里巴巴国际站为例&#xff0c;七成买家以英语沟通&#xff0c;剩下三成的小语种&#xff0c;却难住了平台上近96%的卖家。 “翻译和本地化都做不好&#xff0c;说明你对海外市场根本不重视&#x…

IDC与浪潮联合发布2019数据及存储发展报告:中国迈入新数据时代元年

戳蓝字“CSDN云计算”关注我们哦&#xff01;企业数字化转型进程不断加速&#xff0c;物理世界与虚拟世界正在融合。当两个世界不断以数据的形式互相映射和影响的时候&#xff0c;时代将从量变积累到质变。新数据时代元年已经到来。10月18日&#xff0c;在IDC中国数字化转型年度…

linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(执行安装_07)

接上一篇&#xff1a;linux CentOS7最小化安装环境静默安装Oracle11GR2数据库&#xff08;修改配置文件_06&#xff09; 执行安装前的准备工作&#xff1a; 创建ORACLE实例前提&#xff0c;准备下面6项工作 序号说明链接①安装操作系统https://blog.csdn.net/weixin_40816738/…

e盾网络验证源码_Laravel [mews/captcha] 图片验证码

1 安装配置1.1 使用 composer 安装 [mews/captcha] 扩展composer require mews/captcha项目根目录 composer.json -> require 会新增一行(我的 laravel 版本是 5.6)"mews/captcha": "^3.0"1.2 config/app.php 添加相应代码providers>[ // ... …

开源工具Arena,数据科学家再也不用为Kubernetes犯难啦!

摘要&#xff1a; 为什么要用Kubernetes去难为数据科学家呢&#xff1f; 2018年7月&#xff0c;阿里云将深度学习工具Arena贡献给了开源社区&#xff0c;数据科学家无需学习底层IT资源使用&#xff0c;即可在云端运行深度学习&#xff0c;一分钟内启动深度学习任务&#xff0c…

mysql时间模糊查询_mysql中那些根据时间查询的sql语句

在我们使用mysql是免不了要根据时间去查询一些数据&#xff0c;这个时候一般有几种方式可以去查询。第一种数据库&#xff0c;如果有数据新建时间可以以这个时间为节点&#xff0c;通过当前时间条件去比较时间来查询到此段时间内的数据例如&#xff1a;这个是可传参数的SELECT …

专访阿里数据库备份专家 教你pick最有效的备份系统

摘要&#xff1a; 数据库备份是个老生常谈的话题&#xff0c;看似很简单&#xff0c;但在实际操作过程中&#xff0c;运维人员往往会遇到这样或那样的坑。那么&#xff0c;如今的数据库备份有哪些挑战&#xff1f;如何构建有效备份系统&#xff1f;有什么解决办法&#xff1f; …

linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(静默创建实例_08)

接上一篇&#xff1a;linux CentOS7最小化安装环境静默安装Oracle11GR2数据库&#xff08;执行安装_07&#xff09; 创建ORACLE实例前提&#xff0c;准备下面7项工作 序号说明链接①安装操作系统https://blog.csdn.net/weixin_40816738/article/details/104454497②安装常用工…

当我们在聊 Serverless 时你应该知道这些 | CSDN博文精选

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 杨泽强&#xff08;竹涧&#xff09;转自 &#xff5c; CSDN企业博客责编 | 阿秃说起当前最火的技术&#xff0c;除了最新的区块链、AI&#xff0c;还有一个不得不提的概念是 Serverless。Serverless 作为一种新型的互联网架…

androidbyte数组使用_android byte的用法

byte 为有符号数据&#xff0c;引用文章android byte的使用暴走邻家 2018-01-24 08:55:07 10333 收藏 4分类专栏&#xff1a; android Android基础 文章标签&#xff1a; android app java byte 函数版权今天&#xff0c;简单讲讲android里byte的使用。这个其实很简单&#xff…

Apache RocketMQ 正式开源分布式事务消息

摘要&#xff1a; 近日&#xff0c;Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能&#xff0c;减少内存使用等原有特性增强&#xff0c;还修复了部分社区提出的若干问题&#xff0c;更重要的是该版本开源了社区最为关心的分布式事务消息&#xff0c;而且实现…

如何使用阿里云ARMS诊断Java服务端报错问题

摘要&#xff1a; 这是ARMS团队推出的“网站常见问题1分钟定位系列篇”第二文。 我的网站为什么一错再错 网页报错&#xff0c;尤其是5XX错误是互联网应用最常见的问题之一。5XX错误通常发生于服务端。服务端是业务逻辑最复杂&#xff0c;也是整条网络请求链路中最容易出错、出…

.iml文件_jetbrains误删maven 项目.iml文件后的处理方法

jetbrains 打开maven项目&#xff0c; 出现如下提示这个时候打开 Terminal在提示符下输入&#xff1a;mvn idea:module 回车运行&#xff0c;就可以修复。Relationship between .iml file and pom.xml fileThe intelliJ idea doesnt understand the maven project model (POM.x…

亚马逊消费者业务宣布永久关闭 Oracle 数据库,去O新进展;华为发布最新5G全系列解决方案;苹果正研究新设备“智能戒指”……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

vs未能找到程序集platform.winmd_PP体育直播大连人VS恒大:新老8冠王首尾对决竟有十大看点...

北京时间8月25日&#xff0c;中超大连赛区的第7轮较量&#xff0c;广州恒大迎战大连人&#xff0c;恒大取胜即可继续位列榜首&#xff0c;同时获得半程冠军。而对于前6轮不胜的大连人来说&#xff0c;已经被逼上了绝境。虽然大连人晋级争冠组的前景极为渺茫&#xff0c;但一胜难…

Sentinel如何通过限流实现服务的高可用性

摘要&#xff1a; 在复杂的生产环境下可能部署着成千上万的服务实例&#xff0c;当流量持续不断地涌入&#xff0c;服务之间相互调用频率陡增时&#xff0c;会产生系统负载过高、网络延迟等一系列问题&#xff0c;从而导致某些服务不可用。如果不进行相应的流量控制&#xff0c…

京信通信:数据智能为生产调试“增效瘦身”

摘要&#xff1a; “数据驱动测试优化&#xff0c;突破自动测试边界&#xff0c;赋能智慧测试新模式。”——京信智能制造副总经理葛鑫 “进入车间&#xff0c;映入眼帘的是一条长约20 米的 O 型生产线&#xff0c;产线前三名工人和几个机器人正协同工作&#xff0c;将各种元器…

c++代码好玩_一行Python代码能干嘛?快来看看吧!有表白利器哦

python有很多优雅有趣的代码写法&#xff0c;同时还很简短&#xff0c;以至于当我刚开始接触这个编程语言的时候&#xff0c;就爱不释手。而前几天的编程语言榜单中python也超越了java成为了第一&#xff0c;挺替python开心的。python到底有多有趣呢&#xff1f;一行代码告诉你…

探秘HDFS —— 发展历史、核心概念、架构、工作机制 (上)| 博文精选

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Mr-Bruce转自 &#xff5c; CSDN博客责编 | 阿秃几周前&#xff0c;笔者做了一个与HDFS有关的技术分享&#xff0c;以知识普及为目的&#xff0c;主要分享了Hadoop发展历史、HDFS核心概念、整体架构、工作机制等内容。本文大…

linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(配置数据库监听_09)

修改dbca.rsp响应文件中的重要参数 su - oracle cd response/ vim dbca.rsp本次安装过程中设置了下列参数&#xff1a;(注意下面参数视情况而定&#xff0c;不要照抄&#xff0c;原文件都有说明的) RESPONSEFILE_VERSION "11.2.0" #不能更改 OPERATION_TYPE "…