lico
Março 4, 2010, 6:37pm
#1
Boa Noite!
Amigos estou com a seguinte situação.
Tenho 3 classes(tabela banco)
Disciplina, Professor, Turma
Tenho o formularioDisicplina que necessita de dois combo pra selecionar o Professor e a turma.
mas sabemos q a convenção do vraptor é acessar apenas o seu controller individual e eu não sei como acessar o controller de outro objeto pra retornar a lista dos objetos.
se eu criar o combo no jsp listaProfessor ele aparece a lista dos professor dentro do combo mas como aparecer em outro jsp fora da pasta professor, quero na pasta jsp/disciplina/formulario
agradeço a ajuda de quem puder me ajudar.
acho que o melhor jeito de fazer isso é colocar no método formDisciplina:
public void formDisciplina() {
this.result.include("professores", professorDao.lista());
this.result.include("turmas", turmaDao.lista());
}
onde o result, professorDao e turmaDao vêm do construtor da classe, guardando tudo em fields…
e no jsp /WEB-INF/jsp/disciplina/formDisciplina.jsp vc monta o formulario, e usa as variaveis ${professores} e ${turmas} para montar os combos…
lico
Março 5, 2010, 8:19am
#3
Lucas valeu mesmo pela dica funcionou perfeitamente.
Meu campo select ficou assim
[code]
<c:forEach var=“professor” items="${professor}">
${professor.nome}
[/code]
na classe disciplina esta mapeado da seguinte maneira:
@JoinColumn(name = "idProfessor", referencedColumnName = "idProfessor")
@ManyToOne
private Professor idProfessor;
ai quando mando gravar ele não grava a referencia do objeto, como devo fazer???
alguem pode me dar uma ajuda???
Vc quer disse neste campo , “idProfessor” ?
lico
Março 5, 2010, 8:58am
#5
Pessoal estou tentando gravar a referencia do objeto professor dentro o objeto disciplina mas não estou conseguindo.
Alguem pode me dar uma ajuda???
vou mostrar mos mapeamento e o jsp.
Objeto discilpina esta assim
@JoinColumn(name = "idProfessor")
@ManyToOne(cascade=javax.persistence.CascadeType.ALL)
private Professor idProfessor;
Objeto Professor esta assim
@OneToMany(mappedBy="idProfessor", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Collection<Disciplina> disciplinaCollection = new ArrayList<Disciplina>();
no jsp esta assim
[code]
<c:forEach var=“prof” items="${professor}">
${prof.nome}
[/code]
No DisciplinaController esta assim
public void adiciona(Disciplina disciplina){
validator.addAll(Hibernate.validate(disciplina));
validator.onErrorUse(page()).of(DisciplinaController.class).formulario();
dao.salva(disciplina);
result.redirectTo(DisciplinaController.class).lista();
}
public void formulario(){
this.result.include("turma", turmaDao.listaTudo());
this.result.include("professor", professorDao.listaTudo());
}
Aguardo ajuda de alguem.
Lico
//*************************************************//
/* relacionamento n Mensalidade para 1 Pessoa
*
//*************************************************/
@ManyToOne(cascade=javax.persistence.CascadeType.ALL)
@JoinColumn(name="idpessoa", referencedColumnName = "idpessoa")
private Pessoa pessoa;
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
//*************************************************//
/* relacionamento 1 Pessoa para n Mensalidade
*
//*************************************************/
@OneToMany(mappedBy="pessoa", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
//private Mensalidade mensalidade = new Mensalidade();
private List<Mensalidade> mensalidades = new ArrayList<Mensalidade>();
public List<Mensalidade> getMensalidades() {
return mensalidades;
}
public void setMensalidades(List<Mensalidade> mensalidades) {
this.mensalidades = mensalidades;
}
olha a ordem !
o seu ta asim:
1. @JoinColumn(name = "idProfessor")
2. @ManyToOne(cascade=javax.persistence.CascadeType.ALL)
3. private Professor idProfessor;
o certo não seria assim :
2. @ManyToOne(cascade=javax.persistence.CascadeType.ALL)
1. @JoinColumn(name = "idProfessor")
3. private Professor idProfessor;
lico
Março 5, 2010, 9:17am
#8
juniorsatanas
Fiz o que você disse mas nada mudou. Acho q a ordem não altera os resultados.
Minha dúvida esta certo como estou passando o value aqui??
<select name="disciplina.idProfessor" id="disciplina.idProfessor">
<c:forEach var="prof" items="${professor}">
<option value="${prof}">${prof.nome}</option>
</c:forEach>
</select>
Quando tu testa esse codigo mostra o que ?
lico
Março 5, 2010, 10:00am
#10
ele grava e insere no banco o idProfessor como null
mude essa linha:
por
Outro detalhe, acredito que não seja bom colocar cascade dos dois lados do relacionamento. Costumo colocar só do lado @OneToMany
Também com cascadeType.ALL se você deletar o professor ele poderá deletar a disciplina (não sei se é isso que quer). Pelo menos já me aconteceu.
O relacionamento bi-direcional no hibernate não é muito simples, aconselho ler a documentação e/ou outros exemplos na internet.
lico
Março 5, 2010, 10:54am
#12
Lagaffe
O problema é que o jsp não manda um objeto pro campo disciplina.idProfessor.
ai ele grava no banco como null.
como resolver???
Lico
Você fez a mudança que sugeri?
Na tela, no dropdown aparece a lista de professores?
lico
Março 5, 2010, 11:19am
#14
Lagaffe,
Opa sim aparece a lista dos professores
só que quando mando gravar ele não garva os dados do professor
mude seu select para:
<select name="disciplina.idProfessor.id" id="disciplina.idProfessor.id">
<c:forEach var="prof" items="${professor}">
<option value="${prof.id}">${prof.nome}</option>
</c:forEach>
</select>
e não chame os fields das suas entidades de idBlahBlahBlah… se disciplina se relaciona com professor, o nome do campo deveria ser professor, não idProfessor… se no banco de dados precisa estar id_professor ou algo do tipo, vc anota com @Column (name=“id_professor”)…
[]'s
PS: @juniorsatanas , a ordem em que vc coloca as anotações é irrelevante…
lico
Março 5, 2010, 1:12pm
#16
Lucas Cavalcanti
Boa Tarde!
Lucas ja fiz isso.
Mas continua gravando null o idProfessor
lico
Março 5, 2010, 1:26pm
#17
Lucas Cavalcanti
Na verdade o que acontece agora quando faço desta mandeira que vc mencionou é que a referencia de professor grava na tabela disciplina mas ai ele limpa os dados do professor deixa tudo com null, nome, idade, fone, email.
ele simplesmente limpa os dados só fica com o id preenchido.
oq deve ser?
é por causa do Cascade… se vc tirar o cascade ele só grava o relacionamento, não altera os dados do professor
[]'s
lico
Março 5, 2010, 10:07pm
#19
Caro Lucas
fiz como você disse pra tirar o Cascate mas ai ele continua gravando null.
Tem noção de como resolver isso?
Abraço
a id que vc tah passando pra ele existe no banco?
vc tah passando tudo com professor.id ?
na lógica de salvar tah vindo algum professor dentro da disciplina?