我有2张桌子。
// Accounts
@OneToMany(mappedBy="accounts", cascade=CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Set<Mails> mails;
// Mails
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="user_id" , referencedColumnName="id", insertable=false, updatable=false)
private Accounts accounts;
如何在删除父行时组织删除所有子行?我试图为CascadeType.DELETE_ORPHAN
表设置Accounts
,但如果存在子行,我就无法删除父行。
答案 0 :(得分:5)
问题可能是关系定义错误。假设您有一个与account
表具有一对多关系的mail
表,您将最终无法从account
删除记录,直到它与mail
关联account
1}}行,如果您在mail
上定义关系以引用mail
。正确的方法是在account
上创建外键以引用{{1}}。
使用ON DELETE CASCADE
,告诉MySQL它应删除一行(其表具有外键)如果其父(由键引用)被删除。定义允许此操作,因为在这种情况下,已删除的记录具有到它的引用。相反,如果记录的引用指向其中的其他记录,则不允许删除。
答案 1 :(得分:2)
您在两个实体中使用cascade = CascadeType.ALL。尝试仅在父母那里使用它。这应该工作
//Accounts
@OneToMany(mappedBy="accounts", cascade=CascadeType.ALL,orphanRemoval=true)
private Set<Mails> mails;
//Mails
@ManyToOne
@JoinColumn(name="user_id" , referencedColumnName="id" , nullable=false)
private Accounts accounts;
答案 2 :(得分:0)
“mappedBy”属性表示对方拥有该关系,因此在您的情况下,Mails拥有的关系可能不是您想要的。
JPA Cascades只从一个方向开始工作,来自关系的所有者。
因此,如果您希望在删除帐户时删除邮件,则需要切换关系的所有者:
//Accounts
@OneToMany(cascade=CascadeType.ALL)
private Set<Mails> mails;
//Mails
@ManyToOne(mappedBy="mails")
@JoinColumn(name="user_id" , referencedColumnName="id", insertable=false, updatable=false)
private Accounts accounts;