Eu criei um relacionamento manytomany com o hibernate. Tenho duas classes; a classe clube e a classe campeonato, um capeonato tem vários clubes e um clube pode estar em vários campeonatos.
Consigo criar uma lista de clubes e setar no campeonato usando campeonato.setClubes(listadeClubes), fiz o commit e até ai OK. Mas agora eu quero por exemplo é excluir um clube deste campeonato, ou até adicionar um outro. Como faço isso?
Tentei add um clube fazendo assim, mas não deu certo
List<Clube>clubes=newArrayList<Clube>();////Trazalistadeclubesdocampeonatoclubes=campeonato.getClubes(); //Com essa linha da erro ao fazer commit////Adicionamaisumclubenalistaclubes.add(clube);//Setaalistanocampeonatocampeonato.setClubes(clubes);
Abaixo seguem as classes e o mapeamento.
@javax.persistence.EntitypublicclassCampeonatoimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@javax.persistence.Id@javax.persistence.GeneratedValueprivateLongidCampeonato;@NotNullprivateintgruposCampeonato;@NotNullprivateintclubesCampeonato;@NotEmptyprivateStringtipoCampeonato;@CollectionOfElements@JoinTable(name="campeonato_clube",joinColumns={@JoinColumn(name="idCampeonato")},inverseJoinColumns={@JoinColumn(name="idClube")})privateList<Clube>clubes;// Gets and Sets
@javax.persistence.EntitypublicclassClubeimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@javax.persistence.Id@javax.persistence.GeneratedValueprivateLongidClube;@NotEmptyprivateStringnomeClube;@NotNullprivateintnivelClube;@NotEmptyprivateStringpaisClube;privateStringescudoClube;@ManyToMany(mappedBy="clubes")privateList<Campeonato>campeonatos;// Gets and Sets
Cara, sempre que fiz isso apenas anotei os atributos com @ManyToMany e o mappedBy. Ai vc manda um SchemaExport ele cria uma tabela intermediaria para fazer a relação.
W
Wallfox
von.juliano:
Torne o relacionamento entre as entidades bidirecional, e quando for adicionar um novo clube, salve os dois lados:
Ok. Como faço para tornar o relacionamento bidirecional? No mapeamento que fiz não é o correto?
Grato,
Wallfox
W
Wallfox
egamorim:
Cara, sempre que fiz isso apenas anotei os atributos com @ManyToMany e o mappedBy. Ai vc manda um SchemaExport ele cria uma tabela intermediaria para fazer a relação.
OK. com essa anotação ele também cria a tabela intermediária, mas estou com o problema que expliquei. Como ficaria o mapeamento?
Grato,
Wallfox
E
egamorim
Cara, pelo que sei, assim deveria funcionar:
publicclassCampeonatoimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@javax.persistence.Id@javax.persistence.GeneratedValueprivateLongidCampeonato;@NotNullprivateintgruposCampeonato;@NotNullprivateintclubesCampeonato;@NotEmptyprivateStringtipoCampeonato;@ManyToManyprivateList<Clube>clubes;// Gets and Sets
e
publicclassClubeimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@javax.persistence.Id@javax.persistence.GeneratedValueprivateLongidClube;@NotEmptyprivateStringnomeClube;@NotNullprivateintnivelClube;@NotEmptyprivateStringpaisClube;privateStringescudoClube;@ManyToMany(mappedBy="clubes")privateList<Campeonato>campeonatos;// Gets and Sets
Sobre tornar o relacionamento bidirecional eu não me referia ao mapeamento, mas à associação entre os objetos. Com a linha:
campeonato.getClubes().add(clube);O campeonato tem conhecimento do clube. Esse relacionamento está unidirecional nesse momento. Quando você faz:
clube.getCampeonatos.add(campeonato);Você relaciona de forma bidirecional, porque não só o campeonato conhece o clube, como o clube conhece o campeonato.
Blz? Flw! :thumbup:
W
Wallfox
Olá pessoal,
Tentei fazer como explicado por vocês, porém recebi a seguinte exception:
publicclassselecionaClubeActionextendsBaseAction{publicStringexecute()throwsException{//1//Recebe idClube do clube selecionado no formularioStringidClube=input.getString("idClube");//2//Busca o clube Clubeclube=newClube();DaoFactorydaofactory=newDaoFactory();clube=daofactory.getClubeDao().buscaById(Clube.class,(Long.parseLong(idClube)));//3//Busca CampeonatoCampeonatocampeonato=newCampeonato();campeonato=daofactory.getCampeonatoDao().buscaById(Campeonato.class,1L);//4//Adiciona mais um clube ao campeonatocampeonato.getClubes().add(clube);//adiciona o campeonato no clubeclube.getCampeonatos().add(campeonato);daofactory.beginTransaction();daofactory.getCampeonatoDao().atualiza(campeonato);daofactory.commit();daofactory.close();returnSUCCESS;}}
Grato,
Wallfox
W
Wallfox
Pessoal,
Por favor, sera que alguem ai pode me ajudar?
Grato,
Wallfox
W
Wallfox
Alguém para me ajudar?!?!?!?
V
vitenho
cara eu nao sei nada do teu ambiente mas parece que vc tah abrindo duas sessions ou 1 session nem acabou e ja tem outra querendo tocar nas coisas da primeira
vc tem um session filter que faz o OPEN SESSION IN VIEW?
flw
W
Wallfox
Maravilha!!!
Consegui encontrar o erro. Estava no método BuscaByID.