2016-10-11 3 views
0

테이블에서 하위 항목을 삭제하려고하고 있는데 엔티티가 양방향 관계입니다. 부모 행을 삭제하거나 업데이트 할 수 없습니다 : 외래 키 제약 조건은 실패합니다 "입니다. 부모가있는 하위 항목 관계를 자동 삭제할 때 매핑이 필요합니다.JPA : 부모 행을 삭제하거나 업데이트 할 수 없습니다.

@Entity 
@Table 
public class RuleModel implements Comparable<RuleModel> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "Rule_Id", unique = true, nullable = false) 
    protected Integer id; 

    @OneToOne(fetch = FetchType.EAGER) 
    protected RuleModel parent; 

    @OneToOne(fetch = FetchType.EAGER) 
    protected RuleModel child; 
} 
+0

삭제 사전 제거 블록 모두 부모와 자식 널 (null)을 설정 306144/jpa-cascadetype-all-does-not-delete-orphans – Zorglube

+0

부모 항목을 삭제하고 싶지 않습니다. – Hammad

+0

귀하의 경우, 아마도 '부모'와 '자식'은 모두 같은 대상을 참조합니다. 코드를 확인하십시오. –

답변

0

어린이를 삭제하기 전에 개체 간의 관계를 끊어야합니다. http://stackoverflow.com/questions/ :

0

은 그래서 null로 첫 번째 업데이트 관계를 최대 절전 모드 후 당신은 CASCAD 드롭을 설정해야

@PreRemove 
public void preRemove() { 

    if (parent != null) { 
     parent.setChild(null); 
    } 
    if (child != null) { 
     child.setParent(null); 
    } 
} 
+1

디자인에 오류가 발생하기 쉽습니다. DB에서하는 것처럼 부모와 자식을 따로 저장할 필요가 없습니다. 같은 관계의 2 가지 방향이 더 나아지므로 부모를 DB에 저장하고 그것을 귀하의 엔티티에 매핑하는 것만으로 그들을 치료하십시오. 자식 관계에 대해서는'mappedBy'를 사용하십시오. 그리고'@ PreRemove'에 의존하는 대신 도메인 논리에서 수행하십시오. 지금은 삭제할 수 있지만 부모님은 이제 아무 자녀도 가리키고 있지 않으며 자녀는 부모가 아니므로 일부 데이터 불일치가 생깁니다. –

+0

나는 양방향 링크 목록 – Hammad

+0

을 구축하고 있습니까? 사실 더 심하다. 이중 링크 목록에서 노드를 제거하면 그 노드의 다음 노드는 노드의 다음 노드를 가리키고 다음 노드의 prev는 노드의 prev를 가리켜 야합니다. 당신이하고있는 일은 단순히 명단을 훼손하는 것입니다. 그리고 제가 이전에 언급 한 내용은 여러분이하려고하는 것과 모순이 없습니다. DB에서는 상위 ID 만 저장하면되고 엔티티 모델에서는 지금하고있는 것과 같은 관계의 양방향을 모두 가질 수 있습니다. –

관련 문제