2012-06-04 36 views
0

我有3個表:播放列表廣告PlaylistadMap(連接表)@OneToMany保存重複的記錄

1- 播放列表

@Entity 
@Table(name = "playlist", catalog = "advertisedb") 
public class Playlist implements java.io.Serializable { 


    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    private Set<PlaylistadMap> PlaylistadMaps = new HashSet<PlaylistadMap>(0); 

} 

2- 廣告

@Entity 
@Table(name = "advertisement", catalog = "advertisedb") 
public class Advertisement implements java.io.Serializable { 


    @OneToMany(fetch = FetchType.LAZY, mappedBy = "advertisement") 
    private Set<PlaylistadMap> PlaylistadMaps = new HashSet<PlaylistadMap>(0); 

} 

3- PlaylistadMap

@Entity 
@Table(name = "playlist_ad_map", catalog = "advertisedb") 
public class PlaylistadMap implements java.io.Serializable { 


    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "fk_advertisement", referencedColumnName = "pkid", nullable = false) 
    private Advertisement advertisement; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "fk_playlist", referencedColumnName = "pkid", nullable = false) 
    private Playlist playlist; 

} 

讓假設播放列表1具有在數據庫3個相關廣告:

(1,1)(1,2)(1,3) 如果我想3個廣告添加到舊的 所以列表進行更新將包含(1,1)(1,2)(1,3)(1,4)(1,5)(1, 6) 在DB中的記錄將爲:

(1,1)(1,2)(1,3)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)

我一定要手動刪除重複記錄通過刪除所有的記錄,然後插入新的?或者有關於這個問題的休眠解決方案。

回答

3

您的映射錯誤:您在播放列表和播放列表地圖之間定義了兩個不同的關聯,而不是單個雙向關聯,因爲您在播放列表中忘記了mappedBy屬性。

並且不,您不必刪除並重新添加現有廣告。它不會改變任何東西。只需將您的3個新廣告添加到該集合中,確保該關聯的另一側已正確初始化,並且一切都應該沒問題。

還要注意的是級聯不涉及您的問題。級聯意味着:當我在一個實體上做X時,也在關聯的實體上做X.你只是建立實體之間的關聯在這裏。沒有什麼可以級聯的。