2017-08-30 79 views
0

我遇到問題,因爲我使用中間表來保存其他2個表(播放列表和Midia MidiaPlaylist)的ID。對於多對一/一對多的關係。JPA - 傳遞給持久對象的分離實體多對多

因爲我使用帶有額外列的MapID,我創建了兩個多對一的關係。我使用@EmbeddedId表示法來創建ID的關係。映射類型不能用類型「MERGE」解析。

表Midia

id_midia 
-------- 

表MidiaPlaylist

id_playlist 
id_midia 
nr_order 

臺播放列表

id_playlist 
------- 

我PlaylistController

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; 
} 

我MidiaPlaylist

@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 

控制檯錯誤

脫離實體被persist: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 
的映射

你能幫我理解如何在這個映射中保存多對多嗎? 最好是重做這種關係嗎? 我不知道該做什麼。

+0

的可能的複製[如何堅持@ManyToMany關係 - 重複的條目或脫離實體(https://stackoverflow.com/questions/9821914/how-to-persist-manytomany-relation-duplicate-entry-or-detached -entity) – crizzis

+0

它不重複,因爲我使用EJB,所以它們是不同的問題。我無法堅持,任何人都可以向我提供任何解決方案? –

回答

0

多大的犧牲後,我得到了一個解決方案,它遵循:

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; 

Midia

@Transient 
private List<MidiaPlaylist> midiaPlaylist = new ArrayList<MidiaPlaylist>(); 

PlaylistController

 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有不少一對多映射與額外的列存在。