Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA和Spring数据:为什么会出现删除错误_Jpa_Spring Data - Fatal编程技术网

JPA和Spring数据:为什么会出现删除错误

JPA和Spring数据:为什么会出现删除错误,jpa,spring-data,Jpa,Spring Data,我有三个班(A有很多B,B有很多C): 我总是遇到以下错误: DELETE语句与引用约束“FK_1PBKK0G3B9VNX7APVISDSH7E”冲突。冲突发生在数据库“mydb”、表“dbo.C”和列“b”中 上面有没有明显的地方我做错了?可能的问题是什么 谢谢你的任何意见 问题只是删除查询没有考虑级联注释。它们是低级查询,转换为SQL并执行,但绕过会话(即,如果删除会话中的实体,则不会在会话中标记为已删除)和级联机制 因此,要么通过调用em.remove()获取Bs并将其删除,要么像使用SQ

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

我总是遇到以下错误:

DELETE语句与引用约束“FK_1PBKK0G3B9VNX7APVISDSH7E”冲突。冲突发生在数据库“mydb”、表“dbo.C”和列“b”中

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


谢谢你的任何意见

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

因此,要么通过调用em.remove()获取Bs并将其删除,要么像使用SQL一样:首先明确删除Cs,然后使用delete查询删除Bs。但是,请再次阅读限制:删除查询不能使用联接(除非联接位于子选择中)


这是。

JB,非常感谢您提供的信息!我尝试了em.remove(a.getBs()),但得到了错误“Unknown entity:org.hibernate.collection.internal.PersistentBag”。但是,我能够成功地运行这个循环:for(B:a.getBs()){em.remove(B);}。奇怪的是没有B对象被删除。再次感谢!这可能是因为您没有将它们从A的B列表中删除,它们只是由cascade.JB保存,现在我可以通过分别删除每个对象并将其从A的B列表中删除来删除A的B对象。在这种情况下,这么多单独的delete语句会产生性能问题吗?
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;
    }
}
public void deleteByA(A a) {
        //em is EntityManager 
        Query q = em.createNamedQuery("delete from B where a = :a");
        q.setParameter("a", a);
        q.executeUpdate();  
}