首页 > 解决方案 > 无法使用 JPA 删除表中的行而不抛出异常

问题描述

我有一些代码使用以下代码从表中删除一行:

EntityManager em = getEntityManager();

try 
{

    final EntityTransaction transaction = em.getTransaction();

    transaction.begin();

    em.remove(data);

    transaction.commit();

} catch (final PersistenceException e) {

{

   throw new CPDPersistenceException(e);

}

错误消息是:无法删除或更新父行:外键约束失败......等等。

问题是我要删除的表中存在其他表“reference_id”的外键。但是,无论此主键存在于定义它的持久 Java 对象中的何处,它都有一个应该导致级联删除的引用。例如:

@ManyToOne(cascade = CascadeType.ALL)

@JoinColumn(name="reference_id")

private Reference reference;

通过阅读有关此主题的其他条目,我的理解是,附加到参考的“级联”短语将解决删除与其他表中的其他条目相关的条目的问题。有人有什么想法吗?

标签: javahibernatejpa

解决方案


我从您的代码中了解到,您不应该为被引用实体的拥有实体字段设置 @ManyToOne 注释的级联属性。相反,您必须在父实体中为子实体字段设置@OneToMany注解的级联属性。例如:

class ParentEntity {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private ChildEntity child;
    ...
}

class ChildEntity {
    @ManyToOne
    private ParentEntity parent;
    ...
}

推荐阅读