2013-01-17 11 views
0

您能否告訴我如何構建下面的表/類以避免循環引用?我有一個「學士」學位類中定義如下:JPA2在同一類中構造OneToOne和OneToMany

@Entity 
public class Bachelor { 
... 
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "fk_bachelor") 
    private Study study; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "fk_prior") 
    private List<Study> priorStudies; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "fk_exchange") 
    private List<Study> exchangeStudies; 
... 
} 

@Entity 
class Study { 

    private String title; 
    private String placeOfStudy; 
    etc 
... 
} 

這是爲了表示其具有學士學位的細節一個研究記錄學士學位。如果申請人指定他們已經完成了學士學位,他們可以指定一個或多個在先和交換學習。學士學位加上一個前度結果的一個例子如下:

 
bachelor 

id  | fk_bachelor 

10003  | 10000 
 
study 

id  | title    | fk_prior 

10000  | Bachelor of Arts | 

10001  | Prior Degree  | 10003 

這似乎是工作,除非我需要刪除的表項的罰款。我還收到了來自編譯器的循環引用的警告。所以我不能先從學士學位中刪除,因爲研究引用了fk_prior,並且我不能先從研究中刪除,因爲學士會引用它。我猜這是不好的做法,像這樣構造它。

+0

您顯示的代碼沒有任何循環引用。 – Perception

+0

你已經用'CascadeType.ALL'屬性定義了從'學士'到'學習'的'@ OneToMany'關係,所以當你刪除一個'學士'時,所有連接的'學習'被刪除,不涉及循環引用。 – remigio

+0

我正在使用Postgres數據庫,當我嘗試「從學士學位刪除」時,我得到 錯誤:更新或刪除表「學士」違反外鍵約束「fk_general_details_fk_bachelor」在表「general_details」 詳細信息:Key(id)= (10003)仍然從表「general_details」引用。 從 中的研究結果中刪除錯誤:表「學習」上的更新或刪除違反了表「學士」上的外鍵約束「fk_bachelor_fk_study」 詳細信息:鍵(id)=(10000)仍從表「學士」引用。 – Novarse

回答

0

本科有FK學習和學習有2 FKs本科。不同的JPA提供者會以不同的方式處理,但是你可以通過消除一方來幫助他們。例如,我建議將學士學位設置爲空;打破這個循環會讓學習在學士學位之前被移除。有些數據庫還允許延遲約束處理,直到事務結束時,所有刪除語句都將自己排序。

+0

好,所以需要一些手動管理。謝謝克里斯 – Novarse

相關問題