@OneToMany保存重复记录

时间:2012-06-04 14:46:22

标签: hibernate java-ee jpa

我有3个表:播放列表广告 PlaylistadMap (加入表格)

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) 数据库中的记录将是:

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

我是否必须通过删除所有记录然后插入新记录来手动删除重复记录?或者在这个问题上有一个休眠解决方案。

1 个答案:

答案 0 :(得分:3)

您的映射错误:您在播放列表和PlaylistadMap之间定义了两个不同的关联,而不是单个双向关联,因为您忘记了播放列表中的mappedBy属性。

不,您不必删除现有广告并将其重新添加到该集合中。它不会改变任何东西。只需将3个新广告添加到集合中,确保关联的另一面已正确初始化,一切都应该没问题。

另请注意,级联与您的问题无关。级联意味着:当我在实体上执行X时,也会在关联实体上执行X.您只是在这里创建实体之间的关联。没有什么可以级联的。