【问题标题】:JPA CascadeType.REMOVE not deleting children of a relashionshipJPA CascadeType.REMOVE 不删除关系的子级
【发布时间】:2015-03-24 22:21:57
【问题描述】:

在我的项目中,我有下面报告的类,具有双向关系映射。 当我尝试删除关系的父对象(在我的情况下为 DataProvider)时,主对象被删除,而子对象不会被删除。 我还测试了其他几种注释组合,但似乎都不起作用(orphanRemoval、@ElementDependent、可选 = 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);
}

.

【问题讨论】:

标签: java jpa openjpa


【解决方案1】:

感谢@Smutje 链接,我将查询更改为以下内容(有效):

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

不幸的是,批量删除可能不是很快,但至少对于简单的删除查询,它可以正确级联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多