0

I have a problem because I use an intermediate table to save the IDs of other 2 tables (playlist and Midia for MidiaPlaylist). For a many-to-one / one-to-many relationship.

As I'm using MapID with extra column, I create two many-to-one relationships. I use the @EmbeddedId notation to create the relation of the IDs. The mapping type does not resolve with type "MERGE".

table Midia

id_midia
--------

table MidiaPlaylist

id_playlist
id_midia
nr_order

table Playlist

id_playlist
-------

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

Save the ID in the "playlist" table. And I make a for saving the ids of Midia in MidiaPlaylist.

My MidiaPlaylistBean

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

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

My Playlist

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

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

Console error:

detached entity passed to persist: com.bcm.midia.database.entity.Midia

Where I think the error is: in mapping of 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 

Can you help me understand how to save in this mapping many-to-many? Is it best to redo this relationship? I do not know what to do anymore.

  • Possible duplicate of [How to persist @ManyToMany relation - duplicate entry or detached entity](https://stackoverflow.com/questions/9821914/how-to-persist-manytomany-relation-duplicate-entry-or-detached-entity) – crizzis Aug 31 '17 at 13:25
  • it is not duplicate, they are different problems because I use EJB. I can not persist, could anyone present me any solution? – Arcanjo Gabriel Sep 25 '17 at 19:45

1 Answers1

0

after much sacrifice, I got a solution, it follows:

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

this solved my problem to persist with EJB using hibernate and JPA with a many-to-many mapping with extra column.