如何在@ManyToOne单向映射中使用Spring Boot保存包含子对象的父对象?

问题描述 投票:0回答:1

我是春季靴的新手。我有两个模型类Party(父)和PartyCategory(子)。 PartyCategory成功存储数据ID,labelAr和labelEn。

现在,我在json请求中传递子ID,并在json响应中获取labelAr和labelEn的空值,如下所示。有人可以帮忙什么,做错什么。

我也粘贴了我的代码。

Json Request:

    {

        "name": "Party A",
        "description": "Description of Party A",
        "category": {
            "id": 1
        }
    }

Json response;

{
    "id": 6,
    "name": "Party A",
    "description": "Description of Party A",
    "category": {
        "id": 1,
        "labelAr": null,
        "labelEn": null
    }
}

------------------------------------

Party.java:

    public class Party {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
        private String name;
        private String description;
        @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
        @JoinColumn(name = "category_id")
        private PartyCategory category;

        ....setters and getters

}

PartyCategory.java:-

public class PartyCategory {

    @Id
    @GeneratedValue
    private Integer id;
    private String labelAr;
    private String labelEn;

    ...setters and getters..

Repositories:

public interface PartyCategoryRepository extends JpaRepository<PartyCategory, Integer> {

}
---------------------
public interface PartyRepository extends JpaRepository<Party, Integer> {

}

Services:
public class PartyServiceImpl {
    @Autowired
    PartyRepository partyRepository;

public Party saveParty(Party party) {

        return partyRepository.save(party);
    }


Controller:

@RestController
public class PartyController {

    @Autowired
    PartyServiceImpl partyServiceIml;


    @PostMapping(value = "/party/save")
    public Party saveParty(@RequestBody Party party ) {
        Party returnedParty = partyServiceIml.saveParty(party);
        return returnedParty;
    }
}
--------------
rest spring-boot spring-data-jpa hibernate-mapping
1个回答
0
投票

首先,对数据库以及其余服务使用相同的实体不是一个好习惯。它们应该是单独的实体,通常其余服务的实体称为DTO(数据访问对象)。

现在,关于您的问题,这是正常的代码中的情况,因为在保存新的Party时,您会用空值覆盖与ID 1关联的PartyCategory labelAr和labelEn,因为您没有为这些提供任何值两个标签。

return partyRepository.save(party);

如果要避免此问题,则必须首先从数据库中检索PartyCategory数据,将其设置为Party实体,然后再将其保存到数据库中。像这样的东西:

public class PartyServiceImpl {
    @Autowired
    PartyRepository partyRepository;

    @Autowired
    PartyCategoryRepository partyCategoryRepository;

    public Party saveParty(Party party) {
        PartyCategory partyCategory = partyCategoryRepository.findById(party.getPartyCategory().getId());

        party.setPartyCategory(partyCategory);

        return partyRepository.save(party);
    }
© www.soinside.com 2019 - 2024. All rights reserved.