Ajuda com Session em uma transação N:N no Hibernate
8 respostas
W
Wallfox
Pessoal,
Estou bem perdido, tenho duas classes, uma associação N:N, então em um formulário eu passo o ID de um objeto, faço a procura deste objeto pelo Hibernate, procuro também o outro objeto e então faço a associação tudo em uma action, mas estou recebendo um erro que fala que já possuo sessão aberta, mas se fecho ele fala que esta fechada, sendo assim não sei resolver. Por favor, alguem pode me ajudar?
publicclassselecionaClubeActionextendsBaseAction{publicStringexecute()throwsException{//1//Recebe idClube do clube selecionado no formularioStringidClube=input.getString("idClube");//2//Busca o clube Clubeclube=newClube();DaoFactorydaofactory2=newDaoFactory();daofactory2.beginTransaction();clube=daofactory2.getClubeDao().buscaById(Clube.class,(Long.parseLong(idClube)));daofactory2.close();//3//Busca CampeonatoDaoFactorydaofactory1=newDaoFactory();Campeonatocampeonato=newCampeonato();daofactory1.beginTransaction();campeonato=daofactory1.getCampeonatoDao().buscaById(Campeonato.class,1L);List<Clube>clubes=newArrayList<Clube>();daofactory1.close();//4//Adiciona mais um clube ao campeonatoclubes=campeonato.getClubes();clubes.add(clube);campeonato.setClubes(clubes);//5//Atualiza CampeonatoDaoFactorydaofactory=newDaoFactory();daofactory.beginTransaction();daofactory.getCampeonatoDao().atualiza(campeonato);daofactory.commit();daofactory.close();//6//Coloca a Lista de Clubes novamente na pagina listaClube.jspArrayListCLUBES=newArrayList();output.setValue("clubes",clubes);returnSUCCESS;}}
pra vc fazer isso não prescisa recuperar os dois depois alterar um e salvar de novo, recupera só o campeonato, e adiciona o clube na lista dele, e manda salvar, o resto o hibernate faz pra vc…
W
Wallfox
Sim, o mapeamento é bidirecional.
Gabriel_Galhardi
massa, mas é isso que te falei, coloca o clube na lista de campeonato, e o hibernate “automaticamente” coloca o campeonato no clube…
W
Wallfox
OK, até comecei a fazer aqui, mas ai surgiu uma duvida. Eu recebo o idClube via post (apenas o id) então eu tenho que fazer a procura no BD para trazer todo o objeto e então setar o objeto clube que já existe no BD no objeto Campeonato. Se for isso não consigo fazer como você me explicou. Tem alguma segestão? Será que estou fazerndo errado as Classes ou o mapeamento? Vou mandar pra dar uma conferida
Fiz o que você sugeriu, porém fazendo assim eu só consigo adicionar 1 clube ao campeonato, o que eu queria era adicionar 1 clube, depois mais outro..... e assim por diante.
Vou tentar explicar, no passo que eu numerei como 5, eu façoi uma busca da lista de clubes que já se encontram no campeonato e então adiciona mais o que trouxe do formulário. Se eu tirar esta linha ele funciona, mas só consigo colocar 1 clube no campeonato. Por favor, sugere algo?
publicclassselecionaClubeActionextendsBaseAction{publicStringexecute()throwsException{//1//Recebe idClube do clube selecionado no formularioStringidClube=input.getString("idClube");//2//Busca o clube Clubeclube=newClube();DaoFactorydaofactory=newDaoFactory();daofactory.beginTransaction();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 campeonatoList<Clube>clubes=newArrayList<Clube>();//5//Traz a lista de clubes do campeonatoclubes=campeonato.getClubes();//Com essa linha da erro//6//Adiciona o clube na listaclubes.add(clube);campeonato.setClubes(clubes);//7//Atualiza Campeonato daofactory.getCampeonatoDao().atualiza(campeonato);daofactory.commit();daofactory.close();