我有一个具有子级(多个Property
和多个Rate
)的JPA Reservation
实体。在我的JavaScript应用程序中,我通过JSON
REST
拉{property:{rates:[...], reservations[...]}
。 Rates and Reservations非常冗长,因此当我发布属性更新(例如更改名称)时,我从JSON POST
有效负载中删除了Rates和Reservations。我希望Hibernate只是忽略丢失的键,但是,a,它正在保存中删除所有子级。如果它们不在,我该如何指定使其休眠?
@Entity
public class Property {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
String name;
@OneToMany(mappedBy = "property", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JsonManagedReference
private Set<SeasonRate> rates = new HashSet<>();
@OneToMany(mappedBy = "property", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private Set<Reservation> reservations = new HashSet<>();
}
附:我对级联的理解是有限的,但是我确实想要功能,即如果有人删除某个属性,它必须删除房价和预订。不过,我在任何地方都无法通过完整的属性保存来更新房价或预订,所以也许我应该只使用CASCADE = UPDATE?房价有自己的更新机制,预订也有。
最佳答案
答案较晚,但是,如果您使用Spring MVC Rest控制器而不是Spring Data Rest控制器来处理更新,那么前者似乎不支持部分更新/补丁请求。
使用传统的非静态Web应用程序直接通过某种形式修改实体当然是可行的。例如:
@RequestMapping
public String updateEntity(@ModelAttribute myEntity){
//submitted form parameters merged to existing entity
//loaded via getMyEntity() leaving unmodified fields as they were
}
@ModelAttribute
public MyEntity getMyEntity(){
//load some existing entity
}
但是,当通过@RequestBody将JSON绑定到实体时,这是不可能的:
@RequestMapping
public String updateEntity(@RequestBody myEntity){
//new instance instantiated by the Jackson mapper
//missing fields will be null
}
有一些出色的JIRA与此相关:
https://jira.spring.io/browse/SPR-13127
https://jira.spring.io/browse/SPR-10552
https://jira.spring.io/browse/SPR-13127
以及各种SO问题:
Spring Partial Update Object Data Binding
好消息是,Spring Data Rest确实支持通过补丁进行部分更新,因此,如果可以选择将您的存储库公开为Rest Repository,那么您应该能够实现所需的行为:
https://spring.io/guides/gs/accessing-data-rest/
PUT替换整个记录。未提供的字段将被替换
与null。 PATCH可用于更新项的子集。