Java JPQL DELETE查询:删除另一个实体列表中的实体

Java JPQL DELETE查询:删除另一个实体列表中的实体,java,sql,jpa,Java,Sql,Jpa,我尝试编写一个JPQL查询,它删除另一个实体集合中的所有实体。 (示例代码,不带getter/setter和注释) 但它的结局是外键冲突例外。 另一种方法是 DELETE FROM B b WHERE EXISTS(SELECT a FROM A a WHERE a.id = :id) 但它的结局也是外键违规 但是,如果我直接在数据库上执行sql查询,比如 DELETE FROM B WHERE id = <a id number here> 从B中删除,其中id= 那么就不会

我尝试编写一个JPQL查询,它删除另一个实体集合中的所有实体。 (示例代码,不带getter/setter和注释)

但它的结局是外键冲突例外。 另一种方法是

DELETE FROM B b WHERE EXISTS(SELECT a FROM A a WHERE a.id = :id)
但它的结局也是外键违规

但是,如果我直接在数据库上执行sql查询,比如

DELETE FROM B WHERE id = <a id number here>
从B中删除,其中id=
那么就不会发生错误

EntityManager.remove()不是选项,因为我想删除大量数据


感谢您的每一个回答和帮助。

因为我没有足够的声誉,所以无法添加评论

您跳过了注释,这有点重要,因为这有助于了解哪一方、父方、子方或它们之间的某个方面控制着关系。例如,如果父端正在控制,在某些情况下,清空父端的列表并持久化以删除其子项就足够了。因此,更多的代码将是有帮助的

编辑1:


如果您使用的是JPA 2.0,您可以将
删除=“true”
添加到
@OneToMany
中。然后只需从持久性中获取父级,执行
parent.getData().clear()
,然后执行
EntityManager.merge(parent)
,或者让子级了解关系。您正在尝试删除不知道其家长的孩子,因此我建议通过家长删除,或让他们知道。

好的,在Syfors建议的帮助下,我已经更改了A和B之间的关系:

class Aa implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String value;
}

@Entity
class A implements Serializable {   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @JoinColumn(nullable = false)
    @OneToOne
    private Aa aa;

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, mappedBy = "owner")
    private List<B> data;
}
@Entity
class B implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne
    private A owner;


    private String value;
}

你是对的。我已经在我的主要帖子中添加了注释。父方控制着关系。但是我有大量的a对象,它们存储了大量的B对象。这就是我使用DELETE语句的原因。问题是,如果调用parent.getData(),那么列表中的所有实体都会被选中(无论fetch类型是laze还是eager)。我试图阻止这种情况。我的第一个方法是工作。我已经激活了jpa的日志功能,并在squirrel中测试了生成的查询。但是,jpa生成了一个与第三个表的m:n关系,这将触发外键冲突异常:/
DELETE FROM B WHERE id = <a id number here>
class Aa implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String value;
}

@Entity
class A implements Serializable {   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @JoinColumn(nullable = false)
    @OneToOne
    private Aa aa;

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, mappedBy = "owner")
    private List<B> data;
}
@Entity
class B implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne
    private A owner;


    private String value;
}
DELETE FROM B b WHERE b.id IN(SELECT k.id FROM A a JOIN a.data k WHERE a.id = :id)