2013-02-14 77 views
5

我只是想知道是否有這樣我可以有建立我的MySQL表作爲JPA + Hibernate的:如何界定具有ON DELETE CASCADE

ALTER TABLE `USERINFO` 
    ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE; 

不過,我只得到了這個在我的DDL的方式約束當Hibernate ++ JPA開始建設有 「<property name="hibernate.hbm2ddl.auto" value="create" />

ALTER TABLE `USERINFO` ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`); 

在我的班級我的表,我有這些註釋的設置,

// UserAcc.java 
@Entity 
@Table(name = "USERACC") 
public class UserAcc implements Serializable { 

private static final long serialVersionUID = -5527566248002296042L; 

@Id 
@Column(name = "USERID") 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer userId; 


@OneToOne(mappedBy = "userAcc") 
private UserInfo userInfo; 
.... 


public UserInfo getUserInfo() { 
    return userInfo; 
} 
public void setUserInfo(UserInfo userInfo) { 
    this.userInfo = userInfo; 
} 
... 

,並

// UserInfo.java 
@Entity 
@Table(name = "USERINFO") 
public class UserInfo implements Serializable { 

private static final long serialVersionUID = 5924361831551833717L; 

@Id 
@Column(name = "USERINFO_ID", nullable=false) 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer userInfoId; 

@OneToOne(cascade = {CascadeType.ALL}) 
@JoinColumn(name="USERID", nullable=false) 
@ForeignKey(name = "FK_USER_ID") 
private UserAcc userAcc; 


public Integer getUserInfoId() { 
    return userInfoId; 
} 

public void setUserInfoId(Integer userInfoId) { 
    this.userInfoId = userInfoId; 
} 
... 

需要注意的是,UserAccount表是父/主表在這兒的UserInfo是一個擴展表正常化另一個實體。任何答案將不勝感激。我只是好奇它是如何完成的,因爲我喜歡在MySQL中工作。我真的很習慣從父表中刪除記錄(USERACOUNT),這也將允許我級聯刪除通過子記錄,這取決於來自父/主表的特定記錄。

謝謝!

+0

您是否使用jpa找到了解決此問題的解決方案?我遇到了同樣的問題,我不想使用雙向關係,從而在父級上創建延遲抓取。 – 2013-11-19 09:39:04

回答

5

JPA確實爲cascade操作(合併,持續,刷新,移除)提供了關聯實體的可能性。邏輯在JPA中,不使用數據庫級聯。

沒有符合JPA標準的方法來執行數據庫級聯級聯。如果這樣的級聯是首選的,我們必須回到Hibernate的特定結構:@OnDelete。它至少可以和@OneToMany一起工作,但過去使用@OneToOne和@OnDelete出現了一些問題。

@OnDelete(action = OnDeleteAction.CASCADE) 
+1

謝謝Mikko。我試着用JPA註釋包含OnDelete,但它確實無法工作。我有一個問題,當你想操縱你的數據庫並想添加ON DELETE CASCADE,特別是MySQL時,你如何處理它? – toytoy 2013-02-17 09:30:58

5

在JPA中沒有乾淨的切割手段。以下將爲您提供您想要的內容... 您可以使用CascadeType.DELETE,但此註釋僅適用於EntityManager中的對象,而不適用於數據庫。你想確保ON DELETE CASCADE被添加到數據庫約束。要驗證,您可以配置JPA生成一個ddl文件。看看ddl文件,您會注意到ON DELETE CASCADE不是約束的一部分。將ON DELETE CASCADE添加到ddl文件中的實際SQL中,然後從ddl更新數據庫架構。這將解決您的問題。

link顯示瞭如何在MySQL中使用ON DELETE CASCADE作爲CONSTRAINT。你在約束上做到這一點。您也可以在CREATE TABLEALTER TABLE聲明中執行此操作。 JPA很可能在ALTER TABLE聲明中創建約束。只需在該語句中添加ON DELETE CASCADE即可。

請注意,某些JPA實現者提供了此功能的一種手段。

最後,Hibernate使用OnDelete(action = OnDeleteAction.CASCADE)註釋提供此功能。

1

您可以在UserAcc.userInfo使用Hibernate註解[email protected](action = OnDeleteAction.CASCADE)

public class UserAcc implements Serializable { 

... 

@OneToOne(mappedBy = "userAcc") 
@OnDelete(action = OnDeleteAction.CASCADE) 
private UserInfo userInfo; 

... 

這將在UserInfo表生成DDL ON DELETE CASCADE外鍵。