spring-boot - 为 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"
}
}
请问我能得到一些帮助吗?
解决方案
推荐阅读
- gps - requestLocation() 无法提供有关手表硬件的课程,但可以在 Sim 中工作
- java - ArrayList .add 方法在线程中不起作用
- big-o - 破解编码面试的摊销时间
- python - 一些迭代后,从 kickstarter 抓取数据的 Python 代码不起作用
- c++ - 如何使用 SDL2 在 C++ 中将框呈现到屏幕上?
- javascript - 如何收听 Telegram Bot 错误?(谷歌应用脚本 + 网络钩子)
- php - mail() 错误地向 cPanel 默认帐户发送电子邮件
- javascript - 无法在导航栏中水平对齐菜单项
- docker - 在 Ubuntu 虚拟机中访问 Docker 容器端口
- powershell - ISE 中的 MyInvocation.MyCommand.Path 与常规 PS