JPA CascadeType.REMOVE не удаляет дочерние элементы отношения

В моем проекте у меня есть классы, описанные ниже, с двунаправленным сопоставлением отношений. Когда я пытаюсь удалить родителя отношения (в моем случае DataProvider), основной объект удаляется, а дочерние не удаляются. Я также уже протестировал несколько других комбинаций аннотаций, ни одна из которых не работает (orphanRemoval, @ElementDependent, optional = false, ...).

Удаление выполняется с помощью такого запроса:

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);
}

.


person DocDbg    schedule 26.01.2015    source источник
comment
возможный дубликат JPA: DELETE WHERE не удаляет дочерние элементы и выдает исключение   -  person Smutje    schedule 26.01.2015
comment
возможный дубликат JPA OneToMany не удаляет дочерний элемент   -  person Naili    schedule 26.01.2015
comment
На самом деле это похоже на первую ссылку (проблема DELETE WHERE), даже если в моем случае не возникает никаких исключений. Я думаю, что я все равно должен следовать предложению этой темы ..   -  person DocDbg    schedule 26.01.2015
comment
Из того, что я вижу, вы указываете, что RestMethodImpl является владельцем отношения, поскольку DataProviderImpl утверждает, что отношения отображаются (и, следовательно, принадлежат) другой стороне.   -  person Tobb    schedule 26.01.2015


Ответы (1)


Благодаря ссылке @Smutje я изменил запрос на следующий (который сработал):

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

К сожалению, это может быть не очень быстро для массового удаления, но, по крайней мере, для простых запросов на удаление он правильно каскадируется.

person DocDbg    schedule 26.01.2015