我有一些代码可以使用以下代码从表中删除行:
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;
通过阅读有关此主题的其他条目,我的理解是,引用旁边的“层叠”短语将解决删除与其他表中其他条目相关的一个条目的问题。有人有什么想法吗?
答案 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
}