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



我正在学习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
}
]
}

您正在返回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);
}
}

当您返回merge时,它不会返回整个实体。所以你必须使用下面的代码来正确地返回整个实体:

@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);
}

最新更新