无法通过Postman Spring JPA @OneToMany/@ManyToOne将数据添加到列表

11dmarpk  于 2022-11-07  发布在  Postman
关注(0)|答案(1)|浏览(167)

我正在学习spring-boot jpa,并开始对事情如何工作的感觉不幸的是,我遇到了一些困难。我的示例应用程序是如此简单,只有三个实体,即MemberInfo,MemberProfile,MemberTalents。
我的实体代码如下所示:

@Entity
@Table(name="member_info")
public class MemberInfo {
  //...
  @OneToOne(cascade=CascadeType.ALL)
  @JoinColumn(name="memberProfileId")
  private MemberProfile memberProfile;
  // getters and setters
}

@Entity
@Table(name="member_profile")
public class MemberProfile {
  //...
  @OneToOne(mappedBy="memberProfile")
  private MemberInfo memberInfo;

  @OnetoMany(mappedBy="memberProfile")
  private Set<MemberTalent> memberTalent = new Hashset<>();

  // getters and setters

  public void addMemberTalent(MemberProfile memberProfile) {
      memberTalent.add(memberProfile);
  }

}

@Entity
@Table(name="member_talent")
public class MemberTalent {
  //...
  @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
  @JoinColumn(name="memberProfileId")
  private MemberProfile memberProfile;
  // getters and setters
}

我成功地为这个实体配置了MySQL,并在本地主机上运行,并使用此格式在Postman中发送POST命令。

{
    "memberUserId": 1,
    "memberUser": "John69",
    "memberEmail": "John@gmail.com",
    "memberProfile": {}
}

我得到了这样的回应。

[
  {
    "memberUserId": 1,
    "memberUser": "John69",
    "memberserEmail": "John@gmail.com",
    "memberProfile": {
        "memberProfileId": 1,
        "memberName": null,
        "memberAddress": null,
        "memberTalent": []
    }
  }
]

现在,使用Put命令,我设法编辑了id=1的memberProfile,使用此命令。

{
"memberProfileId": 1,
"memberName": "John Doe",
"memberAddress": "doe@moon.com",
}

我得到的回应是

{
    "memberUserId": 1,
    "memberUser": "John69",
    "memberserEmail": "John@gmail.com",
    "memberProfile": {
        "memberProfileId": 1,
        "memberName": "John Doe",
        "memberAddress": "doe@moon.com",
        "memberTalent": null
}

现在,我的挑战是填满成员人才名单。这是我想出的代码。

@PostMapping("/{memberProfileId}/talents")
MemberProfile addNewTalent(@PathVariable long memberProfileId, @RequestBody 
                            MemberTalent memberTalent) {
    MemberProfile memberProfile = memberProfileService.findById(memberProfileId);
    memberProfile.addMemberTalent(memberTalent);
    return memberProfileService.save(memberProfile);
}

不幸的是,它不会添加任何东西到memberTalent列表中。如果有人能帮助我,我将非常感谢。谢谢。
正在更新:
下面是我在PostMapping中发送的API主体:

{
  "memberTalent": "Guitar",
  "memberMastery": "Expert"
}

下面是响应。即使我发送很多Post请求,响应也是一样的。

{
    "memberUserId": 1,
    "memberUser": "John69",
    "memberserEmail": "John@gmail.com",
    "memberProfile": {
        "memberProfileId": 1,
        "memberName": "John Doe",
        "memberAddress": "doe@moon.com",
        "memberTalent": [
              {
                 "memberTalentId": 0,
                 "memberTalent": null,
                 "memberMastery": null
              }

     ]
}
wfveoks0

wfveoks01#

您将返回memberProfileService.save(memberProfile) &根据保存代码,它将返回em.merge

@Transactional
    @Override
    public <S extends T> S save(S entity) {

        Assert.notNull(entity, "Entity must not be null.");

        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }

当您返回合并时,它不会返回整个实体。因此,您必须使用以下代码来正确返回整个实体:

@PostMapping("/{memberProfileId}/talents")
MemberProfile addNewTalent(@PathVariable long memberProfileId, @RequestBody 
                            MemberTalent memberTalent) {
    MemberProfile memberProfile = memberProfileService.findById(memberProfileId);
    memberProfile.addMemberTalent(memberTalent);
    memberProfileService.save(memberProfile);
    return memberProfileService.findById(memberProfileId);
}

相关问题