【问题标题】:JPA - detached entity passed to persist Many to ManyJPA - 分离实体传递到坚持多对多
【发布时间】:2017-08-30 18:20:28
【问题描述】:

我有一个问题,因为我使用中间表来保存其他 2 个表的 ID(播放列表和 Midia 用于 MidiaPlaylist)。对于多对一/一对多关系。

当我使用带有额外列的 MapID 时,我创建了两个多对一关系。我使用@EmbeddedId 表示法来创建ID 的关系。映射类型无法使用“MERGE”类型解析。

表格媒体

id_midia
--------

表格媒体播放列表

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 保存在“播放列表”表中。我做了一个用于在 MidiaPlaylist 中保存 Midia 的 id。

我的 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.midi.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 

你能帮我理解如何在这个映射中保存多对多吗? 最好重做这段关系吗? 我不知道该怎么办了。

【问题讨论】:

标签: java hibernate jpa persistence


【解决方案1】:

经过一番牺牲,我得到了一个解决方案,如下:

媒体播放列表

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

这解决了我使用休眠和 JPA 以及带有额外列的多对多映射来坚持 EJB 的问题。

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2011-09-16
    • 2015-04-22
    相关资源
    最近更新 更多