![](/img/trans.png)
[英]Many to many org.hibernate.PersistentObjectException: detached entity passed to persist
[英]JPA - detached entity passed to persist Many to Many
我有一個問題,因為我使用一個中間表來保存其他2個表(播放列表和Midia for MidiaPlaylist)的ID。 對於多對一/一對多的關系。
當我使用帶有額外列的MapID時,我創建了兩個多對一關系。 我使用@EmbeddedId表示法創建ID的關系。 映射類型無法解析為“ MERGE”類型。
表Midia
id_midia
--------
桌子MidiaPlaylist
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保存在“播放列表”表中。 我將Midia的ID保存在MidiaPlaylist中。
我的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.midia.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
您能幫助我了解如何在此映射中保存多對多嗎? 重做這種關系最好嗎? 我不知道該怎么辦了。
經過多方犧牲,我得到了解決方案,它是這樣的:
midia播放列表
public class MidiaPlaylist implements Serializable {
@EmbeddedId
private MidiaPlaylistPK pk;
@ManyToOne
@JoinColumn(name="id_midia", updatable = false, insertable = false)
private Midia midia;
@ManyToOne
@JoinColumn(name="id_playlist", updatable = false, insertable = false)
private Playlist playlist;
@Column(name="nr_ordem", nullable=false)
private int nrOrdem;
--GET AND SET
}
MidiaPlaylistPK
@Column(name = "id_midia")
private Long idMidia;
@Column(name = "id_playlist")
private Long idPlaylist;
public MidiaPlaylistPK(){
}
播放清單
//mapping
@Transient
private List<PlaylistProgramacao> listTerminal;
米迪亞
@Transient
private List<MidiaPlaylist> midiaPlaylist = new ArrayList<MidiaPlaylist>();
播放列表控制器
try{
instance = playlistBean.salvarPlaylist(referenceValue);
}catch(Exception e){
e.printStackTrace();
}
int i = 1;
for(Midia midias : dualListMidias.getTarget()){
MidiaPlaylist midiaPlaylist1 = new MidiaPlaylist(midias, instance, i++);
midiaPlaylistBean.salvar(midiaPlaylist1);
}
這解決了我的問題,即使用hibernate和JPA與帶有多列的多對多映射的EJB持久存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.