2017-08-30 3 views
0

私は中間テーブルを使用して他の2つのテーブル(プレイリストとMidiaPlaylistのMidia)のIDを保存するため、問題があります。多対1/1対多の関係の場合。JPA - 継承されたエンティティが永続化に渡されました多対多

私は別の列でMapIDを使用しているので、私は2つの多対1の関係を作成します。 @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 

コンソールのエラー:永続化するために渡された

デタッチエンティティ: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 
のマッピングに:私はエラーがだと思うcom.bcm.midia.database.entity.Midia

このマッピングで多対多を保存する方法を理解できますか? この関係をやり直すのが最善でしょうか? 私はもう何をすべきかわかりません。

+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を永続化するために私の問題を解決しました。

関連する問題