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