[Resolvido] Problema com Many-to-Many no Hibernate

2 respostas
Trebloc

Olá todos.

Estou tendo um problema aqui que não achei solução em outros tópicos e nem mesmo com ajuda do Google.

Tenho as classes Artist e Song, sendo que um artista participa em várias canções e uma canção pode ter vários artistas:

Artist.java

...

    /** As canções do artista. */
    @ManyToMany(cascade={CascadeType.ALL})
    @JoinTable(
        name="Artist_has_Song", schema="public",
        joinColumns={@JoinColumn(name="artist_cd_artist")},
        inverseJoinColumns={@JoinColumn(name="song_cd_song")})
    private Set<Song> songs;

...

Song.java

...

    /** Os artistas presentes na canção. */
    @ManyToMany(cascade={CascadeType.ALL})
    @JoinTable(
        name="Artist_has_Song", schema="public",
        joinColumns={@JoinColumn(name="song_cd_song")},
        inverseJoinColumns={@JoinColumn(name="artist_cd_artist")})
    private Set<Artist> artists;

...

O problema é que quando salvo uma Song, o DAO não salva o Set de artistas junto. O SQL gerado pelo Hibernate na hora:

Hibernate: select nextval ('public.song_cd_song_seq') Hibernate: /* insert com.gmail.trebloc.music.Song */ insert into public.song (Ds_title, Cd_song) values (?, ?)

E isso realmente salva a Song com seu código e seu título, mas sem nenhum Artist (a tabela associativa permanece vazia).

O que fiz de errado? :oops:

2 Respostas

Leozin

Olá

Na artista, ao invéz de:

@ManyToMany(cascade={CascadeType.ALL}) @JoinTable( name="Artist_has_Song", schema="public", joinColumns={@JoinColumn(name="artist_cd_artist")}, inverseJoinColumns={@JoinColumn(name="song_cd_song")}) private Set<Song> songs;

Troque pra:

** As canções do artista. */ @ManyToMany(mappedBy="artists") private Set<Song> songs;

E teste o salvar song denovo :slight_smile:

Trebloc

Opa, fiz isso e parece que agora deu certo :smiley:

Brigadão, Leozin.

Criado 21 de março de 2010
Ultima resposta 22 de mar. de 2010
Respostas 2
Participantes 2