JPA和Spring数据:为什么我得到删除错误

时间:2014-10-15 02:51:36

标签: jpa spring-data

我有三个班级(A有很多B,有很多C):

class A {
    @OneToMany (mappedBy="a", fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    public List<B> bs; 

    public List<B> getBs() {
        return bs;
    }

    public void setBs(List<B> bs) {
        this.bs = bs;
    }
}

class B {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a")
    private A a;

    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }

    @OneToMany (mappedBy="b", fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    public List<C> cs; 

    public List<C> getCs() {
        return cs;
    }

    public void setCs(List<C> cs) {
        this.cs = cs;
    }
}

class C {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "b")
    private B b;

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }
}

我使用Spring Data来处理删除。以下是我能够成功完成的事情:

  1. 如果删除单个记录B,则会删除此记录,并自动删除其关联的C记录。

  2. 如果删除单个记录A,则会删除此记录,并自动删除其关联的B / C记录。

  3. 但是,如果我想通过以下方式删除A的B记录(没有删除A记录):

    public void deleteByA(A a) {
            //em is EntityManager 
            Query q = em.createNamedQuery("delete from B where a = :a");
            q.setParameter("a", a);
            q.executeUpdate();  
    }
    

    我总是收到以下错误:

    DELETE语句与REFERENCE约束“FK_1pbkk0g3b9vnx7apvisddsh7e”冲突。冲突发生在数据库“mydb”,表“dbo.C”,列“b”。

    上面有没有明显的地方我做错了?可能出现什么问题?

    感谢任何输入!!!

1 个答案:

答案 0 :(得分:2)

问题很简单,删除查询不会考虑级联注释。它们是低级查询,转换为SQL并执行,但绕过会话(即,如果删除会话中的实体,它不会在会话中被标记为已删除)和级联机制。

因此,要么通过调用em.remove()来获取Bs并删除它们,要么像对待SQL一样删除它们:首先明确删除Cs,然后使用删除查询删除Bs。但再一次,请阅读限制:删除查询无法使用连接(除非连接位于子选择中)。

这里是relevant documentation