2011-01-02 4 views
5

JPA2 및 최대 절전 모드 구현을 사용하고 있습니다.@OneToOne 주석이있는 테이블에서 삭제

나는 다음과 같은 간단한 매핑을 가지고 : 나는 주제도있는 설문 조사 개체를 삭제할 때

@Entity 
class Topic { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 

    int id; 

    @OneToOne(cascade = ALL) 
    @JoinColumn(name = "id_poll") 
    private Poll poll; 

} 

@Entity 
class Poll { 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    int id; 
} 

지금, 나는 오류가 발생합니다.

은 java.sql.SQLException : 무결성 제약 조건 위반 FKCC42D924982D3F4B 테이블 : [? 여론 조사에서 삭제할 경우 ID =] 문에서 화제가

나는 내가 설문 조사 기록을 삭제할 수 없습니다 때문입니다 이해 다른 테이블에 참조가있는 경우. 이 문제를 어떻게 해결할 수 있습니까? Topic 테이블에서 poll = null을 수동으로 설정해야합니까? 아니면 더 나은 솔루션이 있습니까?

답변

5

이 예상되는 행동 : 양방향 관계

일반적인 문제는 응용 프로그램의 관계 업데이트 한 편이지만, 다른 쪽은 가 업데이트되지 않으며, 동기화된다. JPA에서는 일반적으로 Java에서와 마찬가지로 이 이고 응용 프로그램의 책임은 객체 모델 의 관계을 유지 관리합니다.

출처 : Object corruption, one side of the relationship is not updated after updating the other side

이 처리하는 올바른 장소는 @PreRemove 콜백에 있습니다 또한

@Entity 
class Poll { 

    ... 

    @PreRemove 
    private void preRemove() { 
     Poll poll = topic.getPoll(); 
     topic.setPoll(null); 
    } 
} 

참조 : Have JPA/Hibernate to replicate the “ON DELETE SET NULL” functionality

1

JPA 2의 @OneToOne 주석에 orphanRemoval 플래그가 포함 된 것처럼 보입니다. 설정을 시도해보고 정상적으로 제거되는지 확인할 수 있습니다.

+1

아니, 나는이 시도하고 여전히 아무튼 ' T는 작품 .. 난 여전히 같은 오류가있어 .. – Dawid

1

지금까지 솔루션을 찾을 수 없었기 때문에 Poll 객체를 삭제하기 전에 주어진 Pool을 포함하는 Topic 객체를 항상 가져 와서 null로 설정했습니다.

Topic topic = entityManager.find(Topic.class, 1); 
Poll poll = topic.getPoll(); 
topic.setPoll(null); 
entityManager.remove(poll); 

제대로 작동합니다.

0

문제는 양쪽에서 자동 생성 ID를 사용하고 있다는 사실에 있습니다. 상위 엔티티를 지속하면 하위 엔티티도 유지되지만 상위 엔티티의 ID는 데이터베이스에서 생성 된 ID로 갱신되지 않습니다.

결과적으로 부모를 삭제할 때 자식 ID가 없기 때문에 자식을 삭제하지 않습니다.

자식 엔티티의 ID를 수동으로 설정하고 orphanRemoval이 작동하는지 확인하십시오.

관련 문제