Fórum Persistir @ManyToMany (através do lado fraco do relacionamento) ou alguma alternativa #493770

26/09/2014

0

Boa noite pessoal, estou com o seguinte problema...

Possuo um relacionamento @ManyToMany em um sistema que estou desenvolvendo, o mesmo trata-se de um relacionamento bi-direcional entre as entidades Grupo e Projeto. Foi configurado como "o lado forte" da relação Grupo (assim o marcando com @JoinTable.... etc) e o Projeto sendo o lado fraco (mappedBy...) segue abaixo o código referente aos relacionamentos para melhor entendimento do problema.

[LADO FORTE]entidade GRUPO possui uma List de Projetos
@ManyToMany
	@JoinTable(name="tb_projeto_grupo", joinColumns=@JoinColumn(name="pgr_grupotrabalho", nullable=false), inverseJoinColumns=@JoinColumn(name="pgr_projeto"))
	private List<Projeto> projetos = new LinkedList<>();


....[LADO FRACO] entidade PROJETO possui uma List de Grupos
@ManyToMany(mappedBy="projetos")
	private List<Grupotrabalho> grupostrabalhos = new LinkedList<>();


até aí tudo bem, realizando testes com o JUnit meus serviços, repositórios estão funcionando perfeitamente persistindo os dados no banco e tudo mais e até criando os relacionamentos caso eu set uma lista de PROJETOS em meu GRUPO... "por exemplo: grupoTeste.setProjetos(listaDeProjetosDoGrupoTeste)..."
Sei que pelo funcionamento da JPA isso irá funcionar apenas persistindo os dados "pelo lado forte"... caso eu tente criar um projeto e setar uma lista de grupos em meu projeto não é criado o relacionamento correto ? "exemplo: projetoTeste.setGrupostrabalhos(listaDeGruposDoProjetoTeste)"

E justamente esse é meu problema, acabei criando umas telas para a aplicação utilizando o primefaces, e fiz uma página "cadastrar projetos" onde na criação do mesmo ja queria disponibilizar ao usuário vincular Grupos(previamente já cadastrados no banco de dados) ao projeto que está sendo criado... acabei ja criando o Bean, assim tendo um projeto onde suas caracteristicas são setadas pelo usuário, inclusive a lista de grupos de trabalho do mesmo, porém percebi que esqueci do conceito acima, assim o projeto é criado mas seus relacionamentos não...

Alguém teria alguma solução? alguma OUTRA lógica para executar caso realmente seja impossível setar o relacionamento através do "lado fraco" no meu caso "projetoCadastro.setGrupostrabalhos(listGruposSelecionados)" [ISSO NÃO FUNCIONA EU SEI :( ]

Obrigado! Até mais!!!
Bruno Santana

Bruno Santana

Responder

Post mais votado

29/09/2014

Boa noite pessoal, estou com o seguinte problema...

Possuo um relacionamento @ManyToMany em um sistema que estou desenvolvendo, o mesmo trata-se de um relacionamento bi-direcional entre as entidades Grupo e Projeto. Foi configurado como "o lado forte" da relação Grupo (assim o marcando com @JoinTable.... etc) e o Projeto sendo o lado fraco (mappedBy...) segue abaixo o código referente aos relacionamentos para melhor entendimento do problema.

[LADO FORTE]entidade GRUPO possui uma List de Projetos
@ManyToMany
	@JoinTable(name="tb_projeto_grupo", joinColumns=@JoinColumn(name="pgr_grupotrabalho", nullable=false), inverseJoinColumns=@JoinColumn(name="pgr_projeto"))
	private List<Projeto> projetos = new LinkedList<>();


....[LADO FRACO] entidade PROJETO possui uma List de Grupos
@ManyToMany(mappedBy="projetos")
	private List<Grupotrabalho> grupostrabalhos = new LinkedList<>();


até aí tudo bem, realizando testes com o JUnit meus serviços, repositórios estão funcionando perfeitamente persistindo os dados no banco e tudo mais e até criando os relacionamentos caso eu set uma lista de PROJETOS em meu GRUPO... "por exemplo: grupoTeste.setProjetos(listaDeProjetosDoGrupoTeste)..."
Sei que pelo funcionamento da JPA isso irá funcionar apenas persistindo os dados "pelo lado forte"... caso eu tente criar um projeto e setar uma lista de grupos em meu projeto não é criado o relacionamento correto ? "exemplo: projetoTeste.setGrupostrabalhos(listaDeGruposDoProjetoTeste)"

E justamente esse é meu problema, acabei criando umas telas para a aplicação utilizando o primefaces, e fiz uma página "cadastrar projetos" onde na criação do mesmo ja queria disponibilizar ao usuário vincular Grupos(previamente já cadastrados no banco de dados) ao projeto que está sendo criado... acabei ja criando o Bean, assim tendo um projeto onde suas caracteristicas são setadas pelo usuário, inclusive a lista de grupos de trabalho do mesmo, porém percebi que esqueci do conceito acima, assim o projeto é criado mas seus relacionamentos não...

Alguém teria alguma solução? alguma OUTRA lógica para executar caso realmente seja impossível setar o relacionamento através do "lado fraco" no meu caso "projetoCadastro.setGrupostrabalhos(listGruposSelecionados)" [ISSO NÃO FUNCIONA EU SEI :( ]

Obrigado! Até mais!!!


Só pode existir 1 lado forte no relacionamento ManyToMany e nesse seu caso você terá que trabalhar sempre com o Grupo já que o definiu como tal. Minha sugestão é a seguinte:

Crie o bean Projeto normalmente, salvando e persistindo no banco (sem fazer o setGruposTrabalhos()). Após salvar o bean Projeto, você vai recuperar todos os Grupos que o usuário escolhei e adicionar o projeto em cada um dos grupos e salvar.

Mais ou menos assim:

List<Grupo> grupos = getGrupos();
projeto = save(projeto);

for(Grupo gp : grupos){
   gp.addProjeto(projeto);
   save(gp);
}


Agora você deve refletir: "O grupo deve mesmo ser o lado forte do relacionamento ? Eu fiz a escolha certa". Essa resposta só você pode responder.

Ronaldo Lanhellas

Ronaldo Lanhellas
Responder

Gostei + 1

Mais Posts

29/09/2014

Bruno Santana

Valeu Ronaldo!!! Novamente salvando minha vida...
Eu já havia entendido o conceito JPA envolvido nesse problema e estava tentando realizar algo "parecido" com sua solução mas a falta de experiencia tava fazendo com que eu não conseguisse dar prosseguimento nos pensamentos..

Sobre eu ter escolhido os lados do relacionamento de forma correta, eu não tenho certeza tbm, mas quando fui criando aqui o programa me pareceu correto pelo fato de eu possuir outras telas de cadastro como essa, por exemplo (cadastro de grupos..) em que posso também selecionar projetos e vice-versa... quando me deparei com o problema que citei no tópico até pensei de primeira "JA SEI, VOU TROCAR O LADO DOS RELACIONAMENTOS" mas ai 1 segundo depois pensei "NOSSA CARA COMO EU SOU BURRO" pq ia dar na mesma, eu ia "resolver um lado" e "complicar o outro" auhauhauhauhaua...

A sua solução era algo que estava tentaaando colocar em prática mas não tava enxergando como aplicar, valeu pela força Ronaldo! outras partes do meu sistema também irão usar algo parecido

Obrigado até mais!
Responder

Gostei + 0

29/09/2014

Bruno Santana

Valeu Ronaldo!!! Novamente salvando minha vida...
Eu já havia entendido o conceito JPA envolvido nesse problema e estava tentando realizar algo "parecido" com sua solução mas a falta de experiencia tava fazendo com que eu não conseguisse dar prosseguimento nos pensamentos..

Sobre eu ter escolhido os lados do relacionamento de forma correta, eu não tenho certeza tbm, mas quando fui criando aqui o programa me pareceu correto pelo fato de eu possuir outras telas de cadastro como essa, por exemplo (cadastro de grupos..) em que posso também selecionar projetos e vice-versa... quando me deparei com o problema que citei no tópico até pensei de primeira "JA SEI, VOU TROCAR O LADO DOS RELACIONAMENTOS" mas ai 1 segundo depois pensei "NOSSA CARA COMO EU SOU BURRO" pq ia dar na mesma, eu ia "resolver um lado" e "complicar o outro" auhauhauhauhaua...

A sua solução era algo que estava tentaaando colocar em prática mas não tava enxergando como aplicar, valeu pela força Ronaldo! outras partes do meu sistema também irão usar algo parecido

Obrigado até mais!
Responder

Gostei + 0

29/09/2014

Ronaldo Lanhellas

Valeu Ronaldo!!! Novamente salvando minha vida...
Eu já havia entendido o conceito JPA envolvido nesse problema e estava tentando realizar algo "parecido" com sua solução mas a falta de experiencia tava fazendo com que eu não conseguisse dar prosseguimento nos pensamentos..

Sobre eu ter escolhido os lados do relacionamento de forma correta, eu não tenho certeza tbm, mas quando fui criando aqui o programa me pareceu correto pelo fato de eu possuir outras telas de cadastro como essa, por exemplo (cadastro de grupos..) em que posso também selecionar projetos e vice-versa... quando me deparei com o problema que citei no tópico até pensei de primeira "JA SEI, VOU TROCAR O LADO DOS RELACIONAMENTOS" mas ai 1 segundo depois pensei "NOSSA CARA COMO EU SOU BURRO" pq ia dar na mesma, eu ia "resolver um lado" e "complicar o outro" auhauhauhauhaua...

A sua solução era algo que estava tentaaando colocar em prática mas não tava enxergando como aplicar, valeu pela força Ronaldo! outras partes do meu sistema também irão usar algo parecido

Obrigado até mais!


Sim, quando disse "você escolheu o lado certo ?", é exatamente isso que você citou. Se você percebe que utiliza muito mais o addProjeto() usando a entidade Grupo do que vice-versa então é bem melhor continuar da forma que está, se não você terá muito mais trabalho.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar