2011-03-28 33 views
0

我在多模塊應用程序中有兩個不同模塊的兩個實體類。一個實體在另一個實體之間具有單向一對一關係。在模塊化應用程序中JPA /休眠一對一級聯刪除

主要實體「宋」是從一個模塊歌核心,它的定義是這樣的:

@Entity 
public class Song { 
    @Id(strategy = GenerationType.IDENTITY) 
    private int id; 
    private String name; 
} 

而被稱爲「SongLyrics」下一個實體是從模塊「歌曲的歌詞」,這的定義是這樣的:

@Entity 
public class SongLyrics { 
    @Id(strategy = GenerationType.IDENTITY) 
    private int id; 
    @OneToOne 
    private Song song; 
    @Column(nullable = false, length=1024) 
    private String lyrics; 
} 

由於SongLyrics實體和可選的「歌曲的歌詞」模塊,這可能會或可能不會在最終應用是可用的,它與關係「宋」實體是單向的。

現在我想要刪除「SongLyrics」實體,只要刪除「Song」實體。但現在發生的情況是,「歌詞」實體被留作「孤兒」,只有「歌曲」實體被刪除。

請給出你的見解。謝謝。

回答

3

SongLyrics在一對一關係中不能擁有一個身份。一對一意味着他們共享相同的主鍵。在數據庫中使用常規外鍵指定從SongLyricsSong時,它是多對一的關係。

問題是從SongSongLyrics沒有關係,所以從hibernate級聯不起作用。

這些都是未來在我腦海中的選項:

  • 創建多到任何從SongSongLyrics關係脫鉤的類型,仍然能夠級聯(和瀏覽)。
  • 在應用程序中使用一種事件來通知模塊什麼時候被刪除以允許它們清理(甚至否決)。
  • 使用數據庫觸發器刪除SongLyrics
+0

小修正:'@ OneToOne'創建一個基於一對一關係的外鍵,就像''一樣。 – axtavt 2011-03-28 09:00:22

+0

感謝@Stefan和@axtavt的建議。 我會更新SongLyrics,以便FK to Song也是主鍵。 但正如@Stefan強調的那樣,歌曲與SongLyrics之間仍然沒有任何關係,主要是因爲它們跨越了各個模塊。這就是爲什麼hibernate(或任何JPA提供者)不能傳播「級聯」效應的原因。 感謝Stefan對第二和第三個建議。我正在思考如何使用Spring AOP來處理這個問題,但是如果有任何可移植的方法來創建數據庫觸發器,那也可以。 – 2011-03-29 03:34:45