Como enviar PK para outra entidade via JSF?

,

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?

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.

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 .

1 curtida

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.

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;		
}

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:

Show de bola perfeito. Obrigado resolvido.