Como enviar PK para outra entidade via JSF?

6 respostas Resolvido
jsfjpa
G

Olá Bom Dia estou com um Projeto colocando aprendizado em prática, e ao tentar passar uma Pk durante o cadastro para outra entidade, não funciona, não sobe erro nem nada, somente não funciona o método que estou usando para inserir, basicamente tenho uma entidade aluno e outra conta, relacionamentos de um para muitos, então no cadastro da conta eu gostaria de setar o ID do aluno, esse e o ponto onde estou falhando alguém pode me ajudar?

6 Respostas

Israel_Lima

Fala Gab.

Se ainda estiver com o problema, pode postar o código fonte das classes de modelo (Aluno e Conta) e também do método de cadastro de conta? Se tiver o código no Github ou outro semelhante também seria legal.

G

Opa Bom Dia @Israel_Lima estou ainda com esse problema já fiz diversos malabarismos aqui e não consigo, comecei a fazer esse mesmo projeto com Spring, mas se poder me ajudar agradeço, pois, gostaria mesmo de fazer esse com JavaEE .

Israel_Lima

Bom dia Gab.

Olhando o teu código eu percebi que você está passando na página conta.xhtml o id do aluno selecionado no componente selectOneMenu para uma propriedade alunoId da classe ConBean do tipo Integer. Porém quando você chama o método do DAO para cadastrar a conta, não existe nenhum Aluno associado a conta, ou seja, você está recebendo o Id do aluno no bean, mas não está fazendo nada com ele.

Tenta isso no método cadastrarConta na classe ContaBean:

@Transactional // CREATE
public void cadastrarConta() {
	Aluno aluno = chamar um método que retorne um Aluno por id passando o AlunoId 
    vindo da página xhtml;
    this.conta.alunos = aluno;
	contaDao.insert(conta);		
}

No método acima um aluno em estado Managed está sendo associado a conta e quando ocorre a persistência o ORM se encarrega da relação nas tabelas do banco. Existem outras formas de fazer isso, mas fui pelo caminho mais didático.

Observação: Na sua classe Conta, a propriedade que associa conta com aluno você colocou “alunos” como nome da propriedade, o ideal seria aluno, pois fica mais semântico com este lado do relacionamento.

Seu projeto está bacana, Parabéns!!

Bons estudos.

G

Muito Obrigado Israel pelo feedback, eu ainda continuo nessa lutra, não consegui fazer da forma que vc falou. O máximo que consegui foi assim, más ainda não funciona, qual seria a outra forma ?

@Transactional // CREATE
public Mensalidades cadastrarConta() {	
	
	Aluno aluno = alunoDao.buscaPorId(Aluno.class, alunoId);	
	
	this.mensalidade.getAluno();
	
	contaDao.insert(mensalidade);
	return mensalidade;		
}
Israel_Lima
Solucao aceita

Vamos lá!! Primeiro, o teu mapeamento não está correto segundo as regras do JPA nem mesmo eu acredito da tua regra de negócio. Você precisa pegar o valor vindo do SelectOneMenu que você atribui ao atributo alunoId. A partir dele você captura a entidade Aluno, e não é somente capturar, você tem que atribuir essa mensalidade a um Aluno e para isso você precisa ajustar o mapeamento.

Lado Aluno

@OneToMany(cascade= CascadeType.ALL, fetch=FetchType.EAGER, 
     mappedBy="aluno")
     private List<Mensalidades> mensalidades;
    /* Não esqueça dos get's e set's são Importantíssimos*/

Lado Mensalidades (OBS Não use palavras no plural para suas classes JPA, no plural soa como uma lista)

@ManyToOne
    private Aluno aluno;
    /* Não esqueça dos get's e set's são Importantíssimos*/

Agora que você ajustou o relacionamento para ter acesso ao aluno do lado da mensalidade
o metódo cadastrarConta fica assim:

@Transactional // CREATE
public Mensalidades cadastrarConta() {	
	
	Aluno aluno = alunoDao.buscaPorId(Aluno.class, alunoId);	

	/* Atribuição do aluno já cadastrado e selecionado na lista */
  	this.mensalidade.setAluno(aluno);
	
    /* Persistindo mensalidade vinculada a aluno */
	contaDao.insert(mensalidade);
	return mensalidade;		
}

Testei o código dessa forma e as mensalidades estão sendo salvas no BD vinculada ao Aluno selecionado.

Te recomendo estudar JPA pra fortalecer o conhecimento sobre mapeamentos, relacionamentos unidirecional, bidirecional e outros assuntos. Pois isso interfere bastante no momento do mapeamento das classes do teu projeto.

:smiley::+1:

G

Show de bola perfeito. Obrigado resolvido.

Criado 16 de fevereiro de 2021
Ultima resposta 20 de jun. de 2021
Respostas 6
Participantes 2