JPA - Mapeamento @ManyToOne onde a entidade não existe ainda
13 respostas
gRoOve
Não estou conseguindo realizar este mapeamento quando as entidades da parte Many ainda não existem, vou postar meu código pra ser mais fácil o entendimento:
Eu vou realizar primeiro a persistência de uma Categoria e em um outro momento irei realizar a persistência dos Pontos de Interesse, como configuro isso no JPA?
Mas e quanto ao fato de eu salvar primeiro a Categoria e depois os Pontos de Interesse?
Rodrigo_Sasaki
Você precisa setar a sua Categoria persistida como atributo de cada PontoInteresse.
Categoria categoria = new Categoria();
entityManager.persist(categoria);
PontoInteresse ponto = new PontoInteresse();
ponto.setCategoria(categoria);
entityManager.persist(ponto);
A idéia é basicamente essa.
gRoOve
Então, eu não tenho um PontoInteresse quando vou persistir a Categoria, isso que preciso fazer, sacou?
Como persistir a Categoria primeiro, e num segundo momento persistir um PontoInteresse e vincular a uma determinada Categoria.
Rodrigo_Sasaki
Categoria categoria = entityManager.find(Categoria.class, 1); //Supondo que a PK da sua categoria tem valor 1
PontoInteresse ponto = new PontoInteresse();
ponto.setCategoria(categoria);
entityManager.persist(ponto);
Tem outras maneiras de fazer, mais performáticas inclusive. Mas assim funciona.
Entendi. No caso quando eu for cadastrar um PontoInteresse, eu tenho na tela um SelectOneMenu(PrimeFaces), o qual estou populando a partir do ManagedBean CategoriaMB. Qual a melhor forma pra eu conseguir setar dentro do PontoInteresse a Categoria selecionada no SelectOneMenu? Tem como pegar o value do SelectOneMenu e setar Categoria direto dentro do PontoInteresse?
Outra coisa, quando eu persistir o Categoria sem ter nenhum objeto PontoInteresse inserido em list vai ocorrer erro ou salva normal?
Hebert_Coelho
Basta enviar para o select uma lista de Categoria. Quando se utilizar uma classe própria em um select, será necessário utilizar um converter. Aqui tem um exemplo: JSF: Converter e Bean Auto Complete.
quando eu persistir o Categoria sem ter nenhum objeto PontoInteresse inserido em list vai ocorrer erro ou salva normal?
Tenta uai. :lol: :lol: :lol:
gRoOve
Obrigado pela ajuda galera, mas agora estou com dificuldades em fazer o Converter rodar, quando tento executar o método:
ele entra em looping, não sei o que posso estar fazendo errado. Segue meu código para análise:
packagecom.modelo.managedBean;importcom.modelo.bean.CategoriaServico;importcom.modelo.dao.CategoriaServicoDAO;importjava.util.ArrayList;importjava.util.List;importjavax.faces.bean.ManagedBean;@ManagedBeanpublicclassCategoriaServicoMB{privateIntegerid;privateCategoriaServicoDAOcategoriaDAO=newCategoriaServicoDAO();privateCategoriaServicocategoriaServico=newCategoriaServico();privateList<CategoriaServico>categorias=newArrayList<CategoriaServico>();// GETTER / SETTERpublicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;if(id!=null){categoriaServico=categoriaDAO.recuperarCategoriasServico(this.getId());}}publicCategoriaServicogetCategoriaServico(){returncategoriaServico;}publicvoidsetCategoriaServico(CategoriaServicocategoriaServico){this.categoriaServico=categoriaServico;}publicList<CategoriaServico>getCategorias(){categorias=categoriaDAO.listarCategoriaServico();returncategorias;}// REGRAS DE NEGÓCIOpublicStringsalvar(){if(categoriaDAO.inserirCategoriaServico(categoriaServico)){return"sucessoOperacao";}else{return"falhaOperacao";}}publicStringexcluir(){categoriaServico=categoriaDAO.recuperarCategoriasServico(categoriaServico.getIdCategoriaServico());if(categoriaDAO.excluirCategoriaServico(categoriaServico)){return"sucessoOperacao";}else{return"falhaOperacao";}}publicStringatualizar(){if(categoriaDAO.atualizarCategoriaServico(categoriaServico)){return"sucessoOperacao";}else{return"falhaOperacao";}}publicCategoriaServicogetCategoriaServicoPorNome(Stringnome){this.getCategorias();for(CategoriaServicocategoria:categorias){if(categoria.getNomeCategoria().equals(nome)){returncategorias.get(categoria.getIdCategoriaServico());}}returnnull;}}
Rodrigo_Sasaki
Retire a linha FacesContext.getCurrentInstance(); pois voce ja recebe o faces context como parametro no converter
gRoOve
Se eu retirar esta linha não consigo compilar pois a variável context não está inicializada, ai se eu seto ela como null, nem entra na linha de baixo…CategoriaServicoMB categoriaServicoMB = (CategoriaServicoMB) …
Olhe os 3 parâmetros que você recebe no método, o primeiro, é a instância do FacesContext, o segundo é o componente associado ao converter, e o terceiro, a String em si.
você não precisa pegar novamente a instância do faces context, porque ela ja é enviada a você como parâmetro, seu arg0.
gRoOve
Muito obrigado cara, nem acredito que funcionou =D
Agora, gostaria de mais um ajuste, sempre que for excluir uma CategoriaServico e exister um PontoInteresse vinculado a ela não deixar, só posso excluir a CategoriaServico depois que excluir todos os PontoInteresse vinculados a ela. Sabe como?