在不引发异常的情况下无法使用JPA删除表中的行

时间:2018-07-20 14:45:02

标签: java hibernate 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;

通过阅读有关此主题的其他条目,我的理解是,引用旁边的“层叠”短语将解决删除与其他表中其他条目相关的一个条目的问题。有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我从您的代码中了解到,您不应为引用实体的所属实体字段设置@ManyToOne批注的层叠属性。相反,您必须在子实体字段的父实体中设置@OneToMany批注的cascade属性。例如:

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

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

答案 1 :(得分:1)

您正在使用单向休眠关系。而且,由于您正在对Uuid和Attachment实体的引用字段使用级联属性,因此仅对这两个实体的操作会影响Reference实体,反之亦然。 我建议使用双向关系,并为Reference实体中的uuid和Attachment字段设置@OneToMany批注的层叠属性,如下所示:

public class Reference implements Serializable {

@Id
@Column(name = "reference_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int referenceID;

@OneToMany(mappedBy = "reference", cascade=CascadeType.ALL)
private Attachment attachment;

@OneToMany(mappedBy = "reference", cascade=CascadeType.ALL)
private Uuid uuid;

MORE STUFF
}

public class Attachment implements Serializable {

@ManyToOne
@JoinColumn(name = "reference_id")
private Reference reference;

MORE STUFF
}

public class Uuid extends Serializable {

@ManyToOne
@JoinColumn(name = "reference_id")
private Reference reference;

MORE STUFF
}