복붙노트

[SPRING] Hibernate가 JSON 포스트에없는 자식 객체들을 삭제하는 것을 어떻게 막을 수 있습니까?

SPRING

Hibernate가 JSON 포스트에없는 자식 객체들을 삭제하는 것을 어떻게 막을 수 있습니까?

나는 아이들이있는 JPA Property 엔티티를 가지고있다 (여러 개의 Rate와 Multiple Reservation의 것). 내 자바 스크립트 애플리케이션에서 REST {property : {rates : [...], reservations [...]}를 통해 JSON을 가져온다. 요금과 예약은 매우 장황합니다. 따라서 이름 변경과 같은 속성 업데이트를 게시 할 때 JSON POST 페이로드에서 요금과 예약을 삭제합니다. 나는 Hibernate가 단순히 누락 된 키를 무시하기를 희망했지만, 슬프게도, 저장시 모든 자식을 제거하고있다. 최대 절전 모드로 설정하지 않으면 최대 절전 모드를 무시하도록 지정할 수 있습니까?

@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<>();

}

Ps : 계단식에 대한 나의 이해는 제한적이지만 실제로 누군가가 부동산을 지우면 요금과 예약을 삭제해야한다는 기능을 원합니다. 아무데도 전체 속성을 통해 요금이나 예약을 업데이트하지 않으므로 CASCADE = UPDATE를 사용해야합니까? 요금에는 자체적 인 업데이트 메커니즘이 있으므로 예약도해야합니다.

해결법

  1. ==============================

    1.그러나 Spring Data Rest 컨트롤러가 아니라 업데이트를 처리하기 위해 Spring MVC Rest 컨트롤러를 사용하는 경우에는 부분 업데이트 / 패치 요청을 지원하지 않는 것으로 보입니다.

    그러나 Spring Data Rest 컨트롤러가 아니라 업데이트를 처리하기 위해 Spring MVC Rest 컨트롤러를 사용하는 경우에는 부분 업데이트 / 패치 요청을 지원하지 않는 것으로 보입니다.

    양식을 통해 엔티티를 직접 수정하는 기존의 비 안정적인 웹 앱으로 작업하는 것은 물론 가능합니다. 예 :

    @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
    } 
    

    그러나 JSON을 @RequestBody를 통해 Entity에 바인딩 할 때 불가능합니다.

    @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 Data Rest가 패치를 통해 부분적인 업데이트를 지원한다는 것입니다. 따라서 저장소를 Rest Repository로 노출하는 옵션 인 경우 필요한 동작을 수행 할 수 있어야합니다.

    https://spring.io/guides/gs/accessing-data-rest/

  2. from https://stackoverflow.com/questions/37681555/how-do-i-prevent-hibernate-from-deleting-child-objects-not-present-in-a-json-pos by cc-by-sa and MIT license