我使用 Boot 创建了一个RESTAPI。在这个API中,我在check-in和Guests之间建立了一个一对多的关系。我创建了一个用于签入的控制器,并使用springJPA的保存函数。save方法同时更新了check-in和guests表,但对于guests表,未添加***guest表***中的签入外键,而是显示为空。请帮助我。我需要同时创建guest和签入。
签入模型
@Data
@Entity
public class Checkin {
@Id
private Long id;
private Integer no_of_guests;
@OneToMany(mappedBy = "checkin", cascade = CascadeType.ALL)
private List<Guest> guests;
}
访客模型
@Data
@Entity
public class Guest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long guest_id;
private String name;
private String mobile_no;
private String address;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "guest_checkin_id", nullable = false )
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Checkin checkin;
}
值机员
@RestController
@RequestMapping("/checkin")
public class CheckinController {
private final CheckinRepository checkinRepo;
private final GuestRepository guestRepo;
public CheckinController(CheckinRepository checkinRepo,GuestRepository guestRepo){
this.checkinRepo = checkinRepo;
this.guestRepo = guestRepo;
}
@PostMapping("/add")
ResponseEntity<Object> roomCheckin(@RequestBody Checkin checkin){
if(checkinRepo.save(checkin) != null){
return ResponseEntity.accepted().body("Checkin Successfull");
}
return ResponseEntity.unprocessableEntity().body("Failed to Checkin");
}
}
1条答案
按热度按时间sy5wg1nm1#
使用实体类作为视图模型类可能有点棘手,尤其是在
Checkin
和Guest
之间存在双向一对多关系的情况下。让我们从验证实体类和仓库是否如所描述的那样工作开始。为了进行测试运行,我不得不为类
Checkin
中的id字段添加@GeneratedValue
。其他变更:
Set
代替List
。请参阅https://stackoverflow.com/a/6563037/14072498@Getter
和@Setter
,而不是@Data
为了验证代码,我在下面添加了一个测试类
CheckinRepositoryTest
。如前所述,使用实体类作为视图模型类可能比较棘手,因此下一步将引入两个新的视图模型类:
CheckinVM
和GuestVM
,以及一个新的服务类GuestService
,该服务类负责保存Checkin
和Guest
示例。代码如下所示。请注意,我只添加了
GuestService
类的框架,我把它留给您来实现。CheckinRepositoryTest
中的代码指示了如何实现它。有了视图模型类,就应该删除
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
。当所有部分都启动并运行后,您应该向新的视图模型类添加验证,以及一些验证行为的集成测试。
您还应该查看一下控制器方法,并在成功和失败情况下使用适当的状态代码。
访客级别
GuestVM类
签入类
签入VM类
签入存储库
签入存储库测试
签入服务类:我把这个留给你去实现
控制器类别