2012-06-22 5 views
1

에서 하이버 네이트 일괄 삭제 또 다른 다 대다 하이버 네이트 질문.다 대다 테이블

@Entity 
public class Strategy implements Serializable { 
    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "STRATEGY_TO_GROUP", joinColumns = {@JoinColumn(name="STRATEGY_ID")}, inverseJoinColumns = {@JoinColumn(name = "STRATEGY_GROUP_ID")}) 
    private Set<StrategyGroup> groups; 
... 
} 

을 그리고 관계의 반대편은 다음과 같습니다 :

@Entity 
public class StrategyGroup implements Serializable { 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "STRATEGY_TO_GROUP", joinColumns = {@JoinColumn(name="STRATEGY_GROUP_ID")}, inverseJoinColumns = {@JoinColumn(name = "STRATEGY_ID")}) 
    private Set<Strategy> strategies = new HashSet<Strategy>(); 

는 내가 지금하고 싶은 것은 모두 테이블 비어 다음과 같이 내가 가장 간단한 다 대다 매핑이 가장 쉬운 방법. 나는 다음을 시도하고있다 (em은 나의 entityManager 임).

em.createQuery("delete from StrategyGroup sg").executeUpdate(); 
em.createQuery("delete from Strategy s").executeUpdate(); 

이렇게하면 @joinTable에 제약 조건 위반이 발생합니다. 반면에 em.remove(strategyGroup); ti가 삭제되면 전략 그룹이 삭제되고 @joinTable이 올바르게 업데이트됩니다.

그럼 어떻게 테이블을 비우겠습니까? 개체를로드하고 하나씩 삭제해야합니까?

도움 주셔서 감사합니다.

+0

은 Strategy, 다른 하나는 StrategyGroup 부분입니까? – Baz1nga

+0

당신이 무엇에 관해 묻고 있는지 확실하지 않습니다 ... 전략과 전략 그룹은 두 개의 개별적인 목표입니다. –

+0

아마도 여기 뭔가 유용한 것을 찾을 수 있습니다 - http://stackoverflow.com/questions/4566614/cascade-deleting-from-join-table-with-manytomany-annotation – Kshitij

답변

2

우선 매핑이 잘못되었습니다. 연결의 한 쪽이 소유자 쪽이어야하며 연결의 매핑을 정의해야합니다. 당신이 정말 toMany 협회에 가져 오는 EAGER 피해야한다, 특히 양쪽에

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "groups") 
private Set<Strategy> strategies = new HashSet<Strategy>(); 

둘째 :이 모든 관련된로드 최대 절전 모드를 강제로 다른 하나는 inserse 측면, 그리고 단지 mappedBy 속성을 사용해야합니다 엔티티를 재귀 적으로 사용할 수 있으며 한 행을로드 할 때마다 두 테이블의 모든 행을 메모리에로드 할 수 있습니다. 귀하의 질문에 이제

:

당신이 두 테이블에서 모든 것을 삭제하려면, 먼저 테이블에 가입해야 할 필요가 비어있는, 다른 테이블 중 하나에 일부 행은 여전히 ​​참조 할 것 행의 조인 테이블, 그리고 그것은 obviosuly 실패합니다. 그렇게하기위한 가장 좋은 방법은 이미 가지고있는 두 개의 HQL 쿼리를 실행하기 전에 SQL 쿼리를 사용하여 조인 테이블의 모든 것을 삭제하는 것입니다.

+0

흥미 롭습니다. 시도 할 것이다. 하지만 먼저 : em.remove (strategyGroup)를 사용하여 로그에서 최대 절전 모드로 이동하여 strategy_to_group에서 삭제 한 다음 전략 그룹에서 삭제를 시도합니다. –

+0

흠, 확실하지 않습니다 ... 연관 매핑을 수정 한 다음 그룹을 제거하거나 전략을 제거하십시오. 일괄 업데이트 및 삭제 쿼리는 세션 및 연결기구를 완전히 우회합니다. 즉, SQL로 변환되어 실행됩니다. –

+0

고정 된 연관 매핑을 사용하여 StrategyGroups에 전략을 더 이상 추가 할 수 없습니다 :) 제안 된 매핑의 정확성을 증명하는 문서의 일부를 가르쳐 주시겠습니까? –