2017-04-01 1 views
1

스프링 부트/스프링 데이터에 문제가있어 중첩 엔티티를 한 방향으로 만 만들 수 있습니다.스프링 데이터 나머지 - 한 방향으로 만 중첩 된 엔티티 만 생성 할 수 있습니다.

두 개의 엔터티 인 Parent and Child가 있고 Parent에는 Child 엔터티와 OnetoMany 관계가 있습니다.

나는이 일을하여 아이를 만드는 경우 :

POST http://localhost:8080/children 
{ 
    "name": "Tenzin" 
} 

하고이 일을하여 부모를 만듭니다

POST http://localhost:8080/parents 
{ 
    "name": "Fred and Alma", 
    "children": [ "http://localhost:8080/children/1" ] 
} 

작동하지 않습니다. 그러나

, 내가 먼저 부모를 만든 다음이 작업을 수행하여 새로운 아이를 작성하는 경우, 그것은하지 작업 :

POST http://localhost:8080/children 
{ 
    "name": "Jacob", 
    "parent": [ "http://localhost:8080/parents/1" ] 
} 
,이 경우는 왜

이 예상되는 동작입니다 또는 I 오전 뭔가 잘못하고 있는거야?

하위 엔티티 (아래 참조)가 하위 속성에서 모두 캐스케이드 = ALL을 갖고 있기 때문에 그렇습니까?

부모 엔티티 :

@Entity 
public class Parent { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    @OneToMany(mappedBy="parent", cascade = CascadeType.ALL) 
    private List<Child> children = new ArrayList<>(); 

    private String name; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public List<Child> getChildren() { 
     return children; 
    } 

    public void setChildren(List<Child> children) { 
     this.children = children; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

아이 엔티티 : 당신이 예에서

@Entity 
public class Child { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    private String name; 

    @ManyToOne 
    private Parent parent; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Parent getParent() { 
     return parent; 
    } 

    public void setParent(Parent parent) { 
     this.parent = parent; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

repos를 표시 할 수 있습니까? – Cepr0

+0

안녕 Cepr0, 그것 : https://github.com/simbro/spring-boot-practice-application - 비록 내가 알아 낸 것 같아요 - 아래 참조하십시오. – simbro

답변

0

아이는 relationchip (이 데이터베이스의 자식 테이블에 저장된 것)의 소유자입니다. 문제가 있다고 생각합니다. Spring Data Rest는 자식 객체를 "children"필드에로드하지만 자식 객체의 "parent"필드도 변경해야한다는 것을 모릅니다. (https://stackoverflow.com/a/1796501/7226417 참조).

스프링 데이터 휴식 이벤트 (http://docs.spring.io/spring-data/rest/docs/current/reference/html/#events)를 잡아서 이것을 해결할 수 있으며 "부모"필드를 수동으로 설정할 수 있습니다.

+1

안녕하세요 Benkuly, 그 대답을 주셔서 감사합니다, 나는 vhild가 관계의 소유자임을 간과했다. 그것은 무슨 일이 일어나고 있는지 설명합니다. 당신의 도움을 주셔서 감사합니다. – simbro

0

위의 Benkuly의 답변을 참조하십시오. 기본적으로 관계에는 소유자가 있어야하며, 관계는 존재해야합니다. 최대 절전 모드 문서를 참조하십시오 :

https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-association

협회는 양방향 수 있습니다. 양방향 관계에서 측면 중 하나 (그리고 오직 하나)는 소유자 여야합니다. 소유자가 연관 열을 업데이트해야합니다. 관계를 담당하지 않는 쪽을 선언하려면 mappedBy 특성이 사용됩니다. mappedBy는 소유자 측의 연결 속성 이름을 나타냅니다. 우리의 경우 여권입니다. 보시다시피, 이미 소유자 측에서 선언되었으므로 조인 열을 선언 할 필요는 없습니다.

관련 문제