【发布时间】:2017-08-30 18:20:28
【问题描述】:
我有一个问题,因为我使用中间表来保存其他 2 个表的 ID(播放列表和 Midia 用于 MidiaPlaylist)。对于多对一/一对多关系。
当我使用带有额外列的 MapID 时,我创建了两个多对一关系。我使用@EmbeddedId 表示法来创建ID 的关系。映射类型无法使用“MERGE”类型解析。
表格媒体
id_midia
--------
表格媒体播放列表
id_playlist
id_midia
nr_order
表格播放列表
id_playlist
-------
我的播放列表控制器
instance.setDtCriacao(new Date(System.currentTimeMillis()));
instance.setQtMidiaTransmissao(dualListMidias.getTarget().size());
instance = playlistBean.salvarPlaylist(referenceValue);
int i = 1;
for(Midia midias : dualListMidias.getTarget()){
MidiaPlaylist midiaPlaylist = new MidiaPlaylist();
MidiaPlaylistPK midiaPlaylistPK = new MidiaPlaylistPK();
midiaPlaylistPK.setIdMidia(midias.getIdMidia());
midiaPlaylistPK.setIdPlaylist(instance.getIdPlaylist());
midiaPlaylist.setPk(midiaPlaylistPK);
midiaPlaylist.setNrOrdem(i++);
midiaPlaylist.setMidia(midias);
midiaPlaylist.setPlaylist(instance);
//playlistBean.salvar(midiaPlaylist);
**midiaPlaylistBean.salvar(midiaPlaylist);** -> error
}
将 ID 保存在“播放列表”表中。我做了一个用于在 MidiaPlaylist 中保存 Midia 的 id。
我的 MidiaPlaylistBean
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public MidiaPlaylist salvar(MidiaPlaylist entity){
try{
entity = super.save(entity);
}catch(Exception e){
e.printStackTrace();
}
return entity;
}
我的 Midia 播放列表
@EmbeddedId
private MidiaPlaylistPK pk = new MidiaPlaylistPK();
public MidiaPlaylist(){
}
@MapsId("idMidia")
@ManyToOne
@JoinColumn(name="id_midia", referencedColumnName="id_midia")
private Midia midia;
@MapsId("idPlaylist")
@ManyToOne
@JoinColumn(name="id_playlist", referencedColumnName="id_playlist")
private Playlist playlist;
@Column(name="nr_ordem", nullable=false)
private int nrOrdem;
public Midia getMidia() {
return midia;
}
public void setMidia(Midia midia) {
this.midia = midia;
}
public Playlist getPlaylist() {
return playlist;
}
public void setPlaylist(Playlist playlist) {
this.playlist = playlist;
}
public void setPk(MidiaPlaylistPK id) {
this.pk = id;
}
public MidiaPlaylistPK getPk() {
return this.pk;
}
public void setNrOrdem(int nrOrdem){
this.nrOrdem = nrOrdem;
}
public int getNrOrdem(){
return this.nrOrdem;
}
我的播放列表
@Id
@GeneratedValue
@Column(name="id_playlist")
private Long idPlaylist;
@OneToMany(mappedBy = "playlist", cascade=CascadeType.MERGE)
private List<MidiaPlaylist> midiaPlaylist;
--get et setter
控制台错误:
传递给持久化的分离实体:com.bcm.midi.database.entity.Midia
我认为错误在哪里:在 Midia 的映射中
@Id
@GeneratedValue
@Column(name="id_midia")
private Long idMidia;
@OneToMany(mappedBy = "midia", fetch = FetchType.LAZY, cascade=CascadeType.MERGE)
private List<MidiaPlaylist> midiaPlaylist;
--get et setter
你能帮我理解如何在这个映射中保存多对多吗? 最好重做这段关系吗? 我不知道该怎么办了。
【问题讨论】:
-
它不是重复的,它们是不同的问题,因为我使用 EJB。我不能坚持,谁能给我任何解决方案?
标签: java hibernate jpa persistence