在不引发异常的情况下,无法使用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;

从阅读关于这个主题的其他条目中,我的理解是,引用中附加的"级联"短语可以解决删除与其他表中其他条目相关的一个条目的问题。有人有什么想法吗?

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

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

您使用的是单向休眠关系。因为您对Uuid和Attachment实体的引用字段都使用了级联属性,所以对这两个实体的操作只会影响引用实体,反之亦然。我建议使用双向关系,并为引用实体中的uuid和附件字段设置@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
}

最新更新