首页 > 解决方案 > 为 ManyToOneRelation 创建控制器

问题描述

请考虑经典的 petshop 应用程序。我想创建一个所有者,我想创建一个宠物。我想要一个端点来用适当的所有者更新宠物记录。

这就是我所拥有的

老板pojo

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Owner {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
    private Set<Pet> pets;
}

宠物pojo

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity

public class Pet {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String breed;

    @ManyToOne
    @JoinColumn(name = "owner_id")
    private Owner owner;
}

这是所有者和宠物的存储库

public interface OwnerRepository extends JpaRepository<Owner, Long> {
}

public interface PetRepository extends JpaRepository<Pet, Long> {
}

这是主人和宠物的服务

@Service
public class OwnerService {

    private final OwnerRepository ownerRepository;

    public OwnerService(OwnerRepository ownerRepository) {
        this.ownerRepository = ownerRepository;
    }

    @Autowired
    public List<Owner> returnAll() {
        return ownerRepository.findAll();
    }

    public Owner saveOwner(Owner owner) {
        return ownerRepository.save(owner);
    }

    public Owner findById(Long id) {
        return ownerRepository.findById(id).orElse(null);
    }

}

@Service
public class PetService {
    private PetRepository petRepository;

    public PetService(PetRepository petRepository) {
        this.petRepository = petRepository;
    }

    public List<Pet> returnAll() {
        return petRepository.findAll();
    }

    public Pet savePet(Pet pet) {
        return petRepository.save(pet);
    }

    public Pet findById(Long id) {
        return petRepository.findById(id).orElse(null);
    }
}

主人和宠物的控制器

@RestController
@RequestMapping(value = "/v1/owners")
public class OwnerController {

    private final OwnerService ownerService;

    @Autowired
    public OwnerController(OwnerService ownerService) {
        this.ownerService = ownerService;
    }

    @GetMapping(value = "/all")
    public List<Owner> getAll() {
        return ownerService.returnAll();
    }

    @PostMapping(value = "/new")
    public Owner persist(@RequestBody final Owner owner) {
        return ownerService.saveOwner(owner);
    }

    @GetMapping("/id/{id}")
    public ResponseEntity<Owner> getOwnerByID(@PathVariable Long id) {
        return new ResponseEntity<>(ownerService.findById(id), HttpStatus.OK);
    }
}

@RestController
@RequestMapping(value = "/v1/pet")
public class PetController {

    private final PetServiceJpa petServiceJpa;
    private final OwnerService ownerService;

    @Autowired
    public PetController(PetServiceJpa petServiceJpa, OwnerService ownerService) {
        this.petServiceJpa = petServiceJpa;
        this.ownerService = ownerService;
    }


    @GetMapping(value = "/all")
    public Set<Pet> getAll() {
        return petServiceJpa.findAll();
    }

    @PostMapping("/new")
    public Long savePet(Owner owner, Pet pet) {
        owner.getPets().add(pet);
        petServiceJpa.save(pet);
        return owner.getId();
    }

    @GetMapping("/id/{id}")
    public ResponseEntity<Pet> getVeByID(@PathVariable Long id) {
        return new ResponseEntity<>(petServiceJpa.findById(id), HttpStatus.OK);
    }

}

这就是我测试api的方式:

所有者 api - 运行良好。我可以看到数据库中的数据

http://localhost:8080/v1/owners/new
          {
              "name": "Joe",
              "pets": [
                  {
                     "breed": "collie " 
                  }
              ]
          }

宠物 api 没有。这是我尝试的:http://localhost:8080/v1/pet/new


          {
              "name": "Joe",
              "pets": [
                  {
                     "breed": "collie " 
                  }
              ]
          }

or 

{
    "pet": {
        "dateOfBirth": "2000-02-12"
    },
    "owner": {
        "name": "Joe"
    }
}

请问我能得到一些帮助吗?

标签: spring-boothibernatejpacontroller

解决方案


推荐阅读