如何在使用Hibernate删除父项时删除所有子行?

时间:2013-06-13 00:23:56

标签: java sql hibernate one-to-many

我有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,但如果存在子行,我就无法删除父行。

3 个答案:

答案 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;