JPA-独立实体通过了许多人,将许多实体持续到许多人



我有问题,因为我使用一个中间表来保存其他2个表的ID(playlist和midia for Midiaplaylist)。对于多对一/一对一的关系。

当我将MAPID与额外的列一起使用时,我创建了两个多一对一的关系。我使用@embeddedid符号来创建ID的关系。映射类型不会用类型的"合并"分解。

桌米亚

id_midia
--------

table 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保存在"播放列表"表中。我做了一个用于保存米迪亚(Midia)的IDS的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

控制台错误

独立的实体传递给了: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;

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使用EXARNATE和JPA进行多个列表。

最新更新