2017-08-30 5 views
0

J'ai un problème car j'utilise une table intermédiaire pour enregistrer les ID des autres tables (liste de lecture et Midia pour MidiaPlaylist). Pour une relation plusieurs-à-un/un-à-plusieurs. Comme j'utilise MapID avec une colonne supplémentaire, je crée deux relations plusieurs-à-un. J'utilise la notation @EmbeddedId pour créer la relation des ID. Le type de mappage ne se résout pas avec le type "MERGE".JPA - entité détachée passée à persister Plusieurs à plusieurs

Table Midia

id_midia 
-------- 

Table MidiaPlaylist

id_playlist 
id_midia 
nr_order 

Table Playlist

id_playlist 
------- 

Mon PlaylistController

0 Enregistrez l'ID dans le tableau "playlist".

Et je fais un pour sauver les ids de Midia dans MidiaPlaylist.

Mon MidiaPlaylistBean

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public MidiaPlaylist salvar(MidiaPlaylist entity){ 
    try{ 
     entity = super.save(entity); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return entity; 
} 

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

Ma Playlist

@Id 
@GeneratedValue 
@Column(name="id_playlist") 
private Long idPlaylist; 

@OneToMany(mappedBy = "playlist", cascade=CascadeType.MERGE) 
private List<MidiaPlaylist> midiaPlaylist; 
--get et setter 

erreur Console:

entité individuelle transmise à persister: com.bcm.midia.database.entity.Midia

où je pense que l'erreur est: dans la cartographie de 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 

Pouvez-vous m'aider à comprendre comment enregistrer dans ce mapping many-to-many? Est-il préférable de refaire cette relation? Je ne sais plus quoi faire.

+0

Copie possible de [Comment persister @ManyToMany relation - entité en double ou détachée] (https://stackoverflow.com/questions/9821914/how-to-persis-manytomany-relation-duplicate-entry-or-detached -entité) – crizzis

+0

ce n'est pas en double, ils sont différents problèmes parce que j'utilise EJB. Je ne peux pas persister, quelqu'un pourrait-il me présenter une solution? –

Répondre

0

après beaucoup de sacrifices, je m'y suis une solution, il suit:

midia Playlist

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(){ 
} 

Playlist

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

cette résolu mon problème persiste avec EJB en utilisant veille prolongée et JPA avec un grand nombre à plusieurs mappage avec colonne supplémentaire.