3

我有 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_ORPHANAccounts表设置,但是如果存在子行,我将无法删除父行。

4

3 回答 3

5

问题可能是关系的定义方向错误。假设您有一个account与表具有一对多关系的表,如果您将关系定义为 reference mail,您最终将无法删除记录,account直到它具有关联mail的行。正确的方法是创建外键来引用。accountmailmailaccount

使用ON DELETE CASCADE,您告诉 MySQL如果其父行(由键引用)被删除,它应该删除一行(其表具有外键)。根据定义,此操作是允许的,因为在这种情况下,删除的记录具有对其的引用。相反,如果一条记录有指向其他记录的引用,则不允许删除。

于 2013-06-13T00:40:52.067 回答
3

您在两个实体中都使用 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;
于 2013-06-13T11:26:35.117 回答
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;
于 2013-06-13T00:59:41.050 回答