Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Spring :向具有ManyToMany关系的实体发送请求

Spring :向具有ManyToMany关系的实体发送请求
EN

Stack Overflow用户
提问于 2021-12-01 13:38:12
回答 1查看 46关注 0票数 1

我正在开发一个数据库,用于添加乐队、音乐家、乐器等。

我有一张桌子“乐队”和一张桌子“音乐家”。他们有一个ManyToMany关系(一个乐队可以有多个音乐家,一个音乐家可以在多个乐队中),有一个额外的桌子BandMusician,有一个embeddedId BandMusicianId。我这样做是因为我希望乐队和音乐家之间的关系也有其他信息,比如音乐家加入乐队的那一年。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Band {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String genre;
    private int year;

    @OneToOne(mappedBy = "band")
    private Website website;

    @OneToMany(mappedBy = "band")
    private List<Album> albuns;

    @OneToMany(mappedBy = "band")
    private List<BandMusician> musicians;

}


@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonDeserialize(using = MusicianJsonDeserializer.class)
public class Musician {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @JsonFormat(pattern = "dd-MM-yyyy")
    @JsonProperty("DoB")
    @Column(name = "date_of_birth")
    private LocalDate DoB;

    @ManyToMany
    @JoinTable(
            name = "musician_instruments",
            joinColumns = @JoinColumn(name = "musician_id"),
            inverseJoinColumns = @JoinColumn(name = "instrument_id")
    )   
    private List<Instrument> instruments = new ArrayList<>();

    @OneToMany(mappedBy = "musician")
    private List<BandMusician> bands;

    public void addInstrument(Instrument instrument) {
        this.instruments.add(instrument);
    }

}


@Embeddable
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BandMusiciansId implements Serializable{
    
    private static final long serialVersionUID = 1L;

    @Column(name = "band_id")
    private Long bandId;

    @Column(name = "musician_id")
    private Long musicianId;
}


@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BandMusician {

    @EmbeddedId
    private BandMusiciansId id = new BandMusiciansId();

    @ManyToOne
    @MapsId("bandId")
    @JoinColumn(name = "band_id")
    private Band band;

    @ManyToOne
    @MapsId("musicianId")
    @JoinColumn(name = "musician_id")
    private Musician musician;

    private String role;
    private int joined;
}

当我收到"/musician“的帖子请求时,我可以拯救一位音乐家。我使用Jackson来反序列化这样的请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "name": "John the Ripper",
    "DoB": "03-12-1965",
    "instruments": "voice, guitar",
    "bands": "Band1, Band2"
}

与杰克逊,我可以得到每个乐队,搜索与BandRepository和创建一个BandMusician。

THE PROBLEM:当我收到请求时,为了创建一个BandMusician,我必须创建一个BandMusiciansId,为此我需要bandId和MusicianId。但我现在正在创作音乐家,所以我没有musicianId。它是在我拯救音乐家的时候自动创建的。

MusicianJsonDeserializer类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MusicianJsonDeserializer extends JsonDeserializer<Musician>{

private final InstrumentRepository instrumentRepository;
private final BandRepository bandRepository;

@Autowired
public MusicianJsonDeserializer(
        InstrumentRepository instrumentRepository,
        BandRepository bandRepository
) {
    this.instrumentRepository = instrumentRepository;
    this.bandRepository = bandRepository;
}

@Override
public Musician deserialize(JsonParser p, DeserializationContext ctxt) 
        throws IOException, JacksonException {
    
    ObjectCodec codec = p.getCodec();
    JsonNode root = codec.readTree(p);
    
    Musician musician = new Musician();
    musician.setName(root.get("name").asText());
    
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
    musician.setDoB(LocalDate.parse(root.get("DoB").asText(), formatter));
    
    if (root.get("instruments") != null) {
        String instrumentList = root.get("instruments").asText();
        String[] instrumentArray = instrumentList.split(", ");
        List<Instrument> musicianInstrumentList = new ArrayList<>();
        
        for (String instrument : instrumentArray) {
            Instrument instrumentFound = 
                    instrumentRepository.findByName(instrument)
                    .orElseThrow(RuntimeException::new);
            // TODO custom exception
            musicianInstrumentList.add(instrumentFound);
        }
        
        musician.setInstruments(musicianInstrumentList);
    }
    
    if (root.get("bands") != null) {
        // TODO Stuck here!

我想做的是:在我的MusicianService中,在拯救音乐家之后,我可以创建BandMusician和关系。不过,我认为在服务层中这样做是一个错误的选择。

编辑:为了更容易理解,我创建了一个只有其中相关部分的项目,并将其推送到github (https://github.com/ricardorosa-dev/gettinghelp)。同样,我想要的是能够向"/musician“发送一个帖子,这将被MusicianJsonDeserializer捕获,并为请求体中发送的每个乐队创建一个BandMusicianId和BandMusician。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-04 07:10:03

我有实体、乐队和音乐家,他们之间有一个ManyToMany关系,有一个关联表BandMusician。

我想要的是在同一个请求中创建实体音乐家和关系(BandMusician)。

就我所能收集到的信息而言,这是不可能的,因为为了在关联表(BandMusician)中创建记录,我必须已经创建了音乐家(我正在此请求中创建)。

我试过每一件事,只是想看看是否有可能,但没能做到。但是,即使这是可能的,这也是一个非常糟糕的实践,因为它会使类过于紧密耦合。

明确的解决方案是只创建带有此请求的音乐家,然后发送另一个请求来创建Band和音乐家之间的连接。

我还尝试用一个请求在BandMusician表中创建许多条目,这也是不可能的,因为JsonDeserializer表似乎不接受List<>作为返回类型。我试图避免提出很多要求来创建关系条目(例如,对于一个在五个乐队中的音乐家来说),但似乎最好保持清晰和简单。

我现在为每个请求保存一个音乐家乐队的关系:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "musician": "Awesome musician",
    "band": "Awesome band",
    "role": "guitar",
    "joined": 2003
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70191536

复制
相关文章
AJAX - 向服务器发送请求请求
如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:
chenchenchen
2022/11/29
1.8K0
AJAX如何向服务器发送请求?
AJAX(Asynchronous JavaScript and XML)是一种在Web应用程序中向服务器发送异步HTTP请求的技术。它通过在后台发送请求并异步地获取响应,实现了与服务器进行数据交互而不需要刷新整个页面。
网络技术联盟站
2023/07/07
5680
Ajax向服务器端发送请求
Ajax 相当于浏览器发送请求与接收响应的代理人,以实现在不影响用户浏览页面的情况下,局部更新页面数据,从而提高用户体验。
小丞同学
2021/08/16
2.3K0
使用 Spring Cloud Bus 向指定的微服务发送消息
要向指定的微服务发送消息,需要使用 Spring Cloud Bus 提供的 DestinationProvider 接口,该接口可以返回目标微服务的名称。在消息广播时,Spring Cloud Bus 会根据目标微服务的名称将消息发送到指定的微服务中。
堕落飞鸟
2023/04/18
8190
使用 Java @Annotations 构建完整的 Spring Boot REST API
本文旨在演示用于构建功能性 Spring Boot REST API 的重要 Java @annotations。Java 注解的使用使开发人员能够通过简单的注解来减少代码冗长。
终码一生
2022/04/15
3.5K0
使用 Java @Annotations 构建完整的 Spring Boot REST API
在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?
在《实现存储过程的自动映射》中,我通过基于T4的代码生成实现了CUD存储过程的自动映射。由于映射的都是基于数据表结构的标准的存储过程,所以它们适合概念模型和存储模型结构相同的场景。如果两种模型存在差异,在进行数据更新操作的时候就会出错。本篇文章主要介绍当概念模型中具有继承关系的两个实体映射到数据库关联的两个表,如何使用存储过程。 目录 一、创建具有继承关系的实体 二、基于继承关系实体的查询与更新 三、映射标准的CUD存储过程 四、修正存储过程 一、创建
蒋金楠
2018/02/07
1.5K0
在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?
Hibernate实体关系映射
上一篇文章我们学习了Hibernate的框架搭建,并且完成了单表的CRUD操作,今天我们来学习Hibernate中的多表关联。
南风
2019/04/22
1.1K0
Hibernate实体关系映射
android客户端向服务器发送请求中文乱码的问
android客户端向服务器发送请求的时候,并将参数保存到数据库时遇到了中文乱码的问题:
yuanyuan
2019/09/10
2.5K0
具有依赖关系的并行操作执行
今天看到看到一篇MSDN文章《Parallelizing Operations With Dependencies》,作者是微软Parallel Computing Platform团队的一个开发经理。文中提供出一种用于并行执行一组具有依赖关系的操作的解决方案,这不由得想起我在一年之前写的一个具有相同的功能的组件。于是翻箱倒柜找了出来,进行了一些加工,与大家分享一下。 一、问题分析 我们知道,较之串行化的操作,并行计算将多个任务同时执行,从而充分利用了资源,提高了应用的整体性能。对于多个互不相干的操作,我们
蒋金楠
2018/01/16
2.7K0
具有依赖关系的并行操作执行
实体-联系图(ER图)_实体关系图
我们通常用实体、联系和属性这三个概念来理解现实问题,因此ER模型比较接近人的思维方式。此外,ER模型用简单的图形符号表达系统分析员对问题域的理解,不熟悉计算机技术的用户也能理解它,因此,ER模型可以作为用户与分析员之间有效的交流工具。
全栈程序员站长
2022/09/29
2.3K0
实体-联系图(ER图)_实体关系图
java发送请求网络请求
import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse
jaychou
2022/12/26
1.8K0
具有依赖关系的并行操作执行
今天看到看到一篇MSDN文章《Parallelizing Operations With Dependencies》,作者是微软Parallel Computing Platform团队的一个开发经理。文中提供出一种用于并行执行一组具有依赖关系的操作的解决方案,这不由得想起我在一年之前写的一个具有相同的功能的组件。于是翻箱倒柜找了出来,进行了一些加工,与大家分享一下。
javascript.shop
2019/09/04
6K0
具有依赖关系的并行操作执行
原生js发送post请求_javascript发送post请求
说明: 要测试restsharp的功能,首先需要了解http传参和下载上传文件的原理,请参考: c#:从http请求报文看http协议中参数传递的几种方式 c#使用Http上传下载文件
全栈程序员站长
2022/10/04
8.6K0
原生js发送post请求_javascript发送post请求
发送Http请求
这是第一部分, 主要使用的是AngleSharp: https://anglesharp.github.io/
solenovex
2022/11/24
4.2K0
发送Http请求
Postman发送请求
HTTP GET请求方法用于从服务器检索数据。数据由唯一的URI(统一资源标识符)标识。
清风穆云
2021/08/09
2.1K0
发送HTTP请求
可以创建%Net.HttpRequest的实例来发送各种HTTP请求并接收响应。此对象相当于Web浏览器,可以使用它发出多个请求。它会自动发送正确的cookie,并根据需要设置Referer标头。
用户7741497
2022/06/09
1.1K0
发送HTTP请求
发出HTTP POST请求。使用此方法可将数据(如表单结果)发送到Web服务器,或上载文件。有关示例,请参阅“发送表单数据”。
用户7741497
2022/06/09
2.2K0
Java生成Soap请求响应实体,Java 生成wsdl请求响应实体
Soap技术过于陈旧,2023还能遇见,真是日了狗了。手动创建XML实体不知何年何月可以创建完成,工欲善其事必先利其器,上插件。
高久峰
2023/10/12
3800
点击加载更多

相似问题

如何更新具有ManyToMany关系的实体

10

具有ManyToMany关系的JPA枚举实体

23

QueryBuilder与具有ManyToMany关系的实体

22

jpa错误404中具有manyToMany关系的实体表上的请求

18

具有条件的ManyToMany关系查询实体

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文