Como preencher um combo com dados de uma lista

25 respostas
L

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.

25 Respostas

L

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…

L

Lucas valeu mesmo pela dica funcionou perfeitamente.

Meu campo select ficou assim

<select name="disciplina.idProfessor">
<c:forEach var="professor" items="${professor}">
<option value="${professor.idProfessor}">${professor.nome}</option>
</c:forEach>
</select>

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???

J

Vc quer disse neste campo , “idProfessor” ?

L

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
<select name="disciplina.idProfessor">
<c:forEach var="prof" items="${professor}">
<option value="${prof}">${prof.nome}</option>
</c:forEach>
</select>
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

J
//*************************************************//
/*  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&lt;Mensalidade&gt; mensalidades = new ArrayList&lt;Mensalidade&gt;();

 public List&lt;Mensalidade&gt; getMensalidades() {
         return mensalidades;
          }

         public void setMensalidades(List&lt;Mensalidade&gt; mensalidades) {
         this.mensalidades = mensalidades;
          }

olha a ordem !

J

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

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>
J

Quando tu testa esse codigo mostra o que ?

L

ele grava e insere no banco o idProfessor como null

L

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.

L

Lagaffe

O problema é que o jsp não manda um objeto pro campo disciplina.idProfessor.

ai ele grava no banco como null.

como resolver???

L

Lico

Você fez a mudança que sugeri?

Na tela, no dropdown aparece a lista de professores?

L

Lagaffe,

Opa sim aparece a lista dos professores

só que quando mando gravar ele não garva os dados do professor

L

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…

L

Lucas Cavalcanti

Boa Tarde!

Lucas ja fiz isso.

Mas continua gravando null o idProfessor

L

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?

L

é por causa do Cascade… se vc tirar o cascade ele só grava o relacionamento, não altera os dados do professor

[]'s

L

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

L

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?

L

Boa noite Lucas

BOM VOU MOSTRAR AS PARTES

Na classe disciplina ta assim

@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "professor", referencedColumnName = "idProfessor")
    private Professor professor;

Na classe Professor

@OneToMany(mappedBy="professor", fetch=FetchType.LAZY)
    private List<Disciplina> disciplinaCollection;

No JSP

<select name="disciplina.professor.idProfessor">
    <c:forEach var="professor" items="${professores}">
       <option value="${professor.idProfessor}">${professor.nome}</option>
   </c:forEach>
</select>

aguardo ajudo

valeu

L

Você acha que adianta eu insistir nesta solução???

não sei se vamos conseguir resolver, to pensando em deixar os id apenas numeral e tiral o mapeamento do hibernate entre as classes.

oque você me diz?

porq garvar o id dos combos isso eu consigo sem os relacionamentos ja testei isso.

agaurdo sugestão

abraço brother

L

acho melhor vc trabalhar com Professor do que com Integer ou Long…

Vc precisa configurar esses JoinColumns? O seu banco é legado? se não for (ou se vc puder mudar e/ou criar ele do zero) use as classes da seguinte maneira:

@Entity
public class Disciplina {
    @Id
    @GeneratedValue
    private Long id;

    //...
    @ManyToOne
    private Professor professor;
    //getters e setters
}
@Entity
public class Professor {
    @Id
    @GeneratedValue
    private Long id;

    // não precisa fazer a outra parte do relacionamento
}

ao salvar uma disciplina, se vc passar um Professor com o id setado, e esse id existir na tabela Professor, ele vai fazer o relacionamento sem problema…

Se as tabelas já existirem, e vc não puder mexer, posta o schema delas (describe table, ou algo do gênero) pra eu saber como seria o mapeamento certo…

vc pode usar o Hibernate Tools (um plugin do eclipse) pra fazer a engenharia reversa do banco: ele vai gerar as entidades do Hibernate pra vc, baseado no banco, e vai tudo funcionar…

L

Lucas,

Bom Dia,

Cara fechou o esquema ficou certinho como era pra funcionar.

Valeu mesmo.

Abraço.

D

Perdão por desenterrar, mas como ficaram as jsps desse caso!

Estou com um problema similar, porém não consigo gravar os dados nem exibir em lista.

L

pode descrever por favor o seu problema com mais detalhes, doravan?

Criado 4 de março de 2010
Ultima resposta 26 de out. de 2010
Respostas 25
Participantes 5