2017-07-18 1 views
1

Je ne suis pas en mesure de cartographier correctement même après toutes les étapes prévues dans: https://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/Many-to-many avec des colonnes supplémentaires

CREATE TABLE `tb_pla_playlist` (
`id_playlist` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
`nm_playlist` VARCHAR(10) NOT NULL, 
PRIMARY KEY (`id_playlist`) USING BTREE, 
) 
CREATE TABLE `tb_mid_midia` (
`id_midia` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
`nm_midia` VARCHAR(10) NOT NULL, 
PRIMARY KEY (`id_midia`) USING BTREE 
) 
CREATE TABLE `tb_mip_midia_playlist` (
`id_midia` INT(10) UNSIGNED NOT NULL, 
`id_playlist` INT(10) UNSIGNED NOT NULL, 
`nr_ordem` INT(10) UNSIGNED NOT NULL, 
`CREATED_BY` VARCHAR(10) NOT NULL, 
PRIMARY KEY (`id_midia`,`CATEGORY_ID`), 
CONSTRAINT `FK_id_midia` FOREIGN KEY (`id_midia`) 
     REFERENCES `midia` (`id_midia`), 
CONSTRAINT `FK_id_playlist` FOREIGN KEY (`id_playlist`) 
     REFERENCES `playlist` (`id_playlist`) 
) 

playlist.java

@Entity 
@Table(name="tb_pla_playlist") 
public class Playlist implements Serializable { 
private Set<MidiaPlaylist> midiaPlaylist = new HashSet<MidiaPlaylist>(); 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="id_playlist") 
private Long idPlaylist; 

@OneToMany(mappedBy = "id.playlist", cascade = CascadeType.ALL) 
private Set<MidiaPlaylist> getMidiaPlaylist(){ 
    return midiaPlaylist; 
} 
... 
} 

[Erro: Dans attribut 'midiaPlaylist', la valeur 'mappé par' 'id.playlist' ne peut pas être résolue en un attribut sur l'entité cible.]

midia.java

@Entity 
@Table(name="tb_mid_midia") 
public class Midia implements Serializable { 
private Set<MidiaPlaylist> midiaPlaylist = new HashSet<MidiaPlaylist>(); 

@Id 
@GeneratedValue 
@Column(name="id_midia") 
private Long idMidia; 

@OneToMany(mappedBy = "id.midia", cascade=CascadeType.ALL) 
public Set<MidiaPlaylist> getMidiasPlaylist() { 
    return midiaPlaylist; 
} 

[Erro. ​​Dans l'attribut 'midiasPlaylist', le "mis en correspondance par" valeur 'id.midia' ne peut pas être résolu à un attribut sur l'entité cible]

MidiaPlaylistPK.java

@Embeddable 
public class MidiaPlaylistPK implements Serializable { 
    private Midia midia; 
private Playlist playlist; 

@ManyToOne(cascade = CascadeType.ALL) 
public Midia getMidia(){ 
    return midia; 
} 
public void setMidia(Midia midia){ 
    this.midia = midia; 
} 

@ManyToOne(cascade = CascadeType.ALL) 
public Playlist getPlaylist(){ 
    return playlist; 
} 

public void setPlaylist(Playlist playlist){ 
    this.playlist = playlist; 
} 
} 

MidiaPlaylist.java

@Entity 
@Table(name="tb_mip_midia_playlist") 
@AssociationOverrides({ 
    @AssociationOverride(name="id.playlist", [erro: Persistent type of override attribute "id.playlist" cannot be resolved] 
    joinColumns = @JoinColumn(name = "id_playlist")), 
    @AssociationOverride(name="id.midia", [erro: Persistent type of override attribute "id.midia" cannot be resolved] 
    joinColumns = @JoinColumn(name = "id_midia")) 
    }) 
public class MidiaPlaylist implements Serializable { 
private MidiaPlaylistPK id = new MidiaPlaylistPK(); 
private int nrOrdem; 

@EmbeddedId [erro: Embedded ID class should not contain relationship mappings] 
public MidiaPlaylistPK getId() { 
    return this.id; 
} 
@Column(name="nr_ordem", nullable=false) 
public int getNrOrdem(){ 
    return this.nrOrdem; 
} 

@Transient 
public Midia getMidia(){ 
    return getId().getMidia(); 
} 

@Transient 
public Playlist getPlaylist(){ 
    return getId().getPlaylist(); 
} 

Relational model

Quelqu'un peut-il m'aider avec ces erreurs? Ty!

Répondre

1

Vous devez supprimer @ManyToOne anotation dans @Embeddable et utiliser @MapId anotation insted de @Transient, il y a un exemple ici: http://www.objectdb.com/api/java/jpa/MapsId

+0

J'ai très peu d'expérience dans la cartographie. Et je ne comprends pas pourquoi ces erreurs. J'ai besoin de créer une relation ManyToMany entre les médias et la playlist. Y a-t-il un moyen facile de faire cela? En cherchant sur MapId, apparemment il fait un mapping ManyToOne et dans le cas où j'ai besoin de ManyToMany avec des colonnes supplémentaires. [link] (http://www.thejavageek.com/2014/09/26/jpa-mapsid-example/) –

+0

Merci de votre aide. Serait-ce la solution? \t ' '@MapsId ("Midia") \t publique à long getMidia() { \t \t retour getId() getIdMidia(). \t} \t \t @MapsId ("playlist") \t publique à long getPlaylist() { \t \t retour getId() getIdPlaylist(). \t} \t \t @ManyToOne Midia midia; \t \t @ManyToOne Liste de lecture Playlist; \t \t \t @Column (name = "nr_ordem", annulable = false) \t public int getNrOrdem() { \t \t retour this.nrOrdem; \t} ' –

+0

Dans l'exemple actuel oui, c'est pour le mappage ManyToOne (il montre seulement comment utiliser l'anotation MapsId), mais dans votre cas, vous aurez deux MapsId et vous obtiendrez ce que vous voulez. –