2015-01-26 2 views
1

내 프로젝트에서 양방향 관계 매핑을 사용하여 아래에보고 된 클래스가 있습니다. 관계의 부모 (내 경우 DataProvider)를 삭제하려고하면 기본 객체가 삭제되고 자식은 삭제되지 않습니다. 몇 가지 다른 주석 조합도 테스트했으며, 아무 것도 작동하지 않는 것으로 나타났습니다 (orphanRemoval, @ ElementDependent, optional = false, ...).JPA CascadeType.REMOVE가 relashionship의 자식을 삭제하지 않음

Query q = em.createQuery("DELETE FROM DataProvider dp WHERE ... "); 
q.executeUpdate(); 

사람은 무언가를 제안하십시오 수 있습니다 삭제

이 같은 쿼리를 통해 이루어집니다?

@Entity(name = "DataProvider") 
public class DataProviderImpl implements DataProvider { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    private String name; 
    // ... 

    @OneToMany(targetEntity=RestMethodImpl.class, fetch=FetchType.LAZY, mappedBy="dataProvider", cascade={CascadeType.PERSIST,CascadeType.REMOVE}) 
    private List<RestMethod> methods; 


    public DataProviderImpl() { 
     super(); 
     this.id = 0; 
    } 

    @Override 
    public int getId() { 
     return id; 
    } 
    @Override 
    public void setId(int id) { 
     this.id = id; 
    } 
    @Override 
    public String getName() { 
     return name; 
    } 
    @Override 
    public void setName(String name) { 
     this.name = name; 
    } 
    @Override 
    public List<RestMethod> getMethods() { 
     return methods; 
    } 
    @Override 
    public void setMethods(List<RestMethod> methods) { 
     this.methods = methods; 
    } 
} 

.

public interface DataProvider { 
    public int getId(); 
    public void setId(int id); 
    public String getName(); 
    public void setName(String name); 
    public List<RestMethod> getMethods(); 
    public void setMethods(List<RestMethod> methods); 
} 

.

@Entity(name = "RestMethod") 
public class RestMethodImpl implements RestMethod { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    private String nickname; 
    // ... 

    @ManyToOne(targetEntity=DataProviderImpl.class, fetch=FetchType.LAZY) 
    @JoinColumn(name="dataProviderId") 
    private DataProvider dataProvider; 

    public RestMethodImpl() { 
     super(); 
     this.id = 0; 
    } 

    @Override 
    public int getId() { 
     return id; 
    } 
    @Override 
    public void setId(int id) { 
     this.id = id; 
    } 
    @Override 
    public String getNickname() { 
     return nickname; 
    } 
    @Override 
    public void setNickname(String nickname) { 
     this.nickname = nickname; 
    } 
    @Override 
    public DataProvider getDataProvider() { 
     return dataProvider; 
    } 
    @Override 
    public void setDataProvider(DataProvider dataProvider) { 
     this.dataProvider = dataProvider; 
    } 
} 

.

public interface RestMethod { 
    public int getId(); 
    public void setId(int id); 
    public String getNickname(); 
    public void setNickname(String nickname); 
    public DataProvider getDataProvider(); 
    public void setDataProvider(DataProvider dataProvider); 
} 

. 불행하게도 그것은 매우 빠르게 대량에 대한 삭제하지 않을 수 있습니다

Iterator itr = itemsToDelete.iterator(); 
int deleted = 0; 
while(itr.hasNext()) { 
    em.remove(itr.next()); 
    deleted++; 
} 

, 그러나 적어도 기본 삭제 쿼리에 대한 그 폭포 제대로 : @Smutje 링크에

+1

[JPA : DELETE는 어린이를 삭제하지 않고 예외를 throw하는 가능한 복제본] (http://stackoverflow.com/questions/7825484/jpa-delete-where-does-not-delete-children-and-throws - 예외) – Smutje

+0

가능한 중복 [JPA OneToMany 자식 삭제하지 않음] (http://stackoverflow.com/questions/2011519/jpa-onetomany-not-deleting-child) – Naili

+0

글쎄 실제로 실제로는 첫 번째 링크와 유사합니다 내 경우에 어떤 예외도 던지지 않더라도, 문제가 어디서나 삭제). 어쨌든 그 스레드의 제안을 따라야한다고 생각합니다. – DocDbg

답변

0

덕분에 나는 다음 (일을하는)에 쿼리를 변경했습니다.