2017-12-27 12 views
0

저는 스프링 부트, ibatis, jpa 어플리케이션을 실행하려고합니다.JPA 및 스프링 부트와 함께 엔티티 참조 엔티티에 대한 매핑의 반복 열

여기 내 H2 데이터베이스에서 실행 한 sql 스크립트가 있습니다.

CREATE TABLE COMMITTEE(
    CODE NUMBER PRIMARY KEY, 
    NAME VARCHAR2(100), 
    P_CODE NUMBER, 
    CONSTRAINT P_CODE_FK FOREIGN KEY (P_CODE) REFERENCES COMMITTEE(CODE) 
); 

Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(1, 'Parent 1', NULL); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(2, 'Parent 2', NULL); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(3, 'Parent 3', NULL); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(4, 'Child 1.1', 1); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(5, 'Child 1.2', 1); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(6, 'Child 1.3', 1); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(7, 'Child 3.1', 3); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(8, 'Child 3.2', 3); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(9, 'Child 3.3', 3); 
Insert into COMMITTEE(CODE, NAME, P_CODE) VALUES(10, 'Child 3.1.1', 7); 

그리고 여기 내 실체 :

package org.gso.committee.model; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

@Entity 
@Table(name = "committee") 
public class Committee implements Serializable { 

    private static final long serialVersionUID = 18787545L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long code; 
    private String name; 
    @Column(nullable = true) 
    private long p_code; 

    @ManyToOne() 
    @JoinColumn(name = "p_code") 
    private Committee parent; 

    @OneToMany(mappedBy = "parent") 
    private List<Committee> children = new ArrayList<>(0); 

    public Committee() { 
    } 

    public Committee(long code, String name, long p_code) { 
     this.code = code; 
     this.name = name; 
     this.p_code = p_code; 
    } 

    public long getCode() { 
     return code; 
    } 

    public void setCode(long code) { 
     this.code = code; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public long getP_code() { 
     return p_code; 
    } 

    public void setP_code(long p_code) { 
     this.p_code = p_code; 
    } 

    public Committee getParent() { 
     return parent; 
    } 

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

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

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

    @Override 
    public String toString() { 
     return "Committee [code=" + code + ", name=" + name + ", p_code=" + p_code + "]"; 
    } 
} 

문제는 그 난 항상 오류가 발생하는 경우 : 당신이 같은 별도의 속성으로 p_code를 매핑하는 이유

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: org.gso.committee.model.Committee column: p_code (should be mapped with insert="false" update="false") 

답변

1

질문은 이미 참조 부모를 통해 매핑됩니다. 이 속성을 원하는 경우 읽을

은 그러나 당신은 단지

@Column(nullable = true, insertable = false, updateable = false) 
private long p_code; 

그것은 부모의 참조를 설정하는 것이 중요 선언해야합니다. 입니다 가장 좋은 방법은 다음과 같이 몇 가지 편리한 방법을 추가하는 것입니다

public void addChild(Committee committee) { 
    committee.setParent(this); 
    children.add(committee); 
} 

public void removeChild(Committee committee) { 
    committee.setParent(null); 
    children.remove(committee); 
} 
+0

감사하지만, 심지어 솔루션 getChildren와 비록() 항상 날은 아이를 추가 할 때 –

+0

당신이 부모를 설정하는 비어 있습니다? 답변에서 편집을 참조하십시오. –

+0

사실, 나는 단지 de getAllCommittees()를 원하고 그리스트와 getChildren()을 가져오고 싶다. 나는 그것이 아주 간단하다고 생각한다. 나는 실체에서 뭔가를 놓치고 있다고 생각한다. –