Fórum Ajuda POR FAVOR!!! struts+hibernate #390362

11/11/2010

0

Boa tarde,   preciso muito da ajuda de todos. ja assistir várias video aulas mais ainda não consegui resolver meu problema.   É o seguinte:   estou fazendo uma aplicação web que realiza um cadastro.   no banco de dados tenho duas tabelas: a cidade e a dentista: a relação entre as duas é um-para-muitos (OneToMany), ou seja, uma cidade tem muitos dentistas, certo?    fiz o relacionamento entre as tabelas (nas classes bean),  criando um uma lista de dentistas @OneToMany na tabela cidades e intanciei uma cidade @ManyToOne na tabela dentista.   Criei uma lista de Strings na CidadeDao que relaciona o nome todas as cidades encontratadas (cadastradas) em um <s:select> na interface.  para que na hora do cadastro do dentista o usuario escolha a cidade em que esta o dentista.     As cidades aparecem para escolha no cadastro mais quando grava não esta salvando a ligação entre as duas tabelas, ou seja, na tabela de dentista o campo cidade está NULL, ele não salva o id da tabela cidade.   A verdade é que é a primeira vez que faço isso... e estou precisando muito resolver este problema.   Por favor, se alguem tiver algum tutorial ou mesmo puder me explicar como fazer e salvar este relacionamento muitos-para-um, vou agradecer muito.
Vanessa

Vanessa

Responder

Posts

11/11/2010

Davi Costa

Vc já debugou para ver se no objeto dentista o campo cidade não está null.
Se estiver é problema na página.



Abaixo segue um exemplo de mapeamento:

//class Cliente
@OneToMany(mappedBy="cliente")
    private List<SubCliente> subClientes;

//class SubCliente
@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "CD_CLIENTE", nullable = false)
    private Cliente cliente;

Caso vc queira deixá-lo bidirecional.
Senão basyta colocar assim, não faz mais refência na tabela Cliente:

//class SubCliente
@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "CD_CLIENTE", nullable = false)
    private Cliente cliente;


Att Davi
Responder

Gostei + 0

11/11/2010

Vanessa

O codigo esta assim:   Na classe Cidade    @OneToMany(mappedBy = "cidade", fetch = FetchType.LAZY)
 @Cascade(CascadeType.SAVE_UPDATE)
 private List<Dentista> dentista;     Na classe Dentista    @ManyToOne(fetch = FetchType.EAGER)
 @JoinColumn(name = "cod_cidade", insertable = true, updatable = true)
 @Fetch(FetchMode.JOIN)
 @Cascade(CascadeType.SAVE_UPDATE)
 private Cidade cidade;     mais acho que o problema esta na ACTION, na verdade nao sei direito como fazer lá...   vc poderia me da um exemplo de como ficaria um cadastro assim?   MUITO OBRIGADA!!!!
Responder

Gostei + 0

11/11/2010

Vanessa

Por favor, alguem me ajude!!!!  
Responder

Gostei + 0

11/11/2010

Davi Costa

Posta o código da sua Action e da sua página.
Tenta ver como debugar, para ver se está vindo null no objeto dentista, talvez seja aí seu problema.

Att Davi
Responder

Gostei + 0

12/11/2010

Vanessa

Posta o código da sua Action e da sua página.
Tenta ver como debugar, para ver se está vindo null no objeto dentista, talvez seja aí seu problema.

Att Davi
Obrigada Davi!!!   o metodo da actio é esse:  
public String inserirDentista() {
DentistaDao dd = new DentistaDao();

dentista.setCidade(cidade);

if (validadorCampos()) {

if (dd.cadastraDentista(dentista)) {
lista = pd.listarDentistas();
return "sucessoDentista";
} else
return "erro";

} else {

return "incorreto";

}



}
e na JSP este:
<s:select list="cidades" name="cidade.cidade" label="Cidade"/>
Sobre debugar, realmente terei que ver como funciona!!! Vou dá uma pesquisada. Mais agradeço muito se vc conseguir encontrar o erro nestes códigos. Fico pensando que está faltando alguma coisa neste metodo de inserir mais não sei identificar o que? MUUUIIITO OBRIGADA!!!!
Responder

Gostei + 0

12/11/2010

Davi Costa

Provavelmente é nesse método que vc inseri :
dd.cadastraDentista(dentista)

Coloca a implementação dele.Essa lista de cidades vem do banco né?
Porque se não vier primeiro vc teria que inserir a cidade.

Bom para debugar vai depender da IDE que estiver usando.
Quando levantar o servidor a primeira coisa que vai fazer e subir em modo debug.
Depois na linha de código que vc que inspecionar vc coloca um break-point, vai na esquerda onde fica as linhas (na verdade os números das linhas) e clica duas vezes com o mouse.
Quando a aplicação para lá vc seleciona com o mouse o seu objeto dentisata antes de ser salvo e clica c o botão direito e inspeciona esse objeto e vai como estáseus atributos.



Outra coisa mostra mais código da sua página, se possível pode até colocá-la inteira.

Att Davi
Responder

Gostei + 0

12/11/2010

Vanessa

Provavelmente é nesse método que vc inseri :
dd.cadastraDentista(dentista)

Coloca a implementação dele.Essa lista de cidades vem do banco né?
Porque se não vier primeiro vc teria que inserir a cidade.

Att Davi
      O cadastraDentista está na DentistaDao, é esse:
 
public boolean cadastraDentista(Dentista dentista) {

s.save(dentista);
t.commit();

if (t.wasCommitted()) {

return true;

} else {

return false;

}

}
 
      a JSP está assim:      
 
<fieldset style="width: 567px;">
<legend>CADASTRO DE PACIENTES</legend>
<s:actionerror/>
<s:actionmessage/> 
<s:form action="dentista!inserirDentista" method="post" validate="true" theme="css_xhtml">

<s:hidden name="dentista.cod_dentista"/>

<table>
<tr>
<th>CPF:</th>
<th colspan="5"><s:textfield name="dentista.cpf"/></th>
</tr>
<tr>
<th>Nome:</th>
<th colspan="5"><s:textfield name="dentista.nome" size="62" /></th>
</tr>
<tr>
<td>Sexo:</td>
<td><s:textfield name="dentista.sexo" size="2" /></td>
<th>Idade:</th>
<td><s:textfield name="dentista.idade" size="3" /></td>
<th>Data de nascimento:</th>
<td><s:textfield name="dentista.nascto" size="10"/></td>
</tr>
<tr>
<td>E-mail:</td>
<td colspan="5"><s:textfield name="dentista.email" size="62"/></td>
</tr>
<tr>
<td>Endere&ccedil;o:</td>
<td colspan="5"><s:textfield name="dentista.endereco" size="62"/></td>
</tr>
<tr>
<td>Bairro:</td>
<td colspan="2"><s:textfield name="dentista.bairro" size="15"/></td>
<td>Cidade:</td>
<td colspan="2"><s:select list="cidades" name="cidade.cidade."/></td>

</tr>
<tr>
<td>CEP:</td>
<td colspan="2"><s:textfield name="dentista.cep" /></td>
</tr>
<tr>
<td>Telefone:</td>
<td><s:textfield name="dentista.tel_fixo" size="10" /></td>
</tr>
<tr>
<td colspan="3"><s:submit value="GRAVAR" /></td>
<td colspan="3"><s:reset value="Limpar" /></td>
</tr>
</table>
</s:form>
</fieldset>
 
  Ps.: coloquei só a parte do form pq a página toda é muito grande e a maioria é só código de html e css.   Novamente, MUUUIIITO OBRIGADA!!!

 

 
Responder

Gostei + 0

12/11/2010

Vanessa

Essa lista de cidades vem do banco né?
Porque se não vier primeiro vc teria que inserir a cidade.

  Ah!! Sim, esta lista vem do banco e já tem cidades cadastradas lá!
Responder

Gostei + 0

12/11/2010

Davi Costa

Dá uma olhada nesse exemplo:

http://www.vaannila.com/struts-2/struts-2-example/struts-2-ui-tags-example-1.html


Acredito que ajudar muito, inclusive dá para baixar os fontes dele.

Att Davi
Responder

Gostei + 0

12/11/2010

Vanessa

Davi,   acabei de reparar que toda vez que cadastro um dentista na tabela de cidades tbm é acrescentado uma linha em branco, como se eu tivesse realizado uma inserção nela. Acho que é esta linha    
 dentista.setCidade(cidade); 
que está no metodo inserirDentista.

Responder

Gostei + 0

12/11/2010

Davi Costa

Faz também esse teste, altera esse método e deixa assim para verificar se a cidade não está vindo nula:
public String inserirDentista() { DentistaDao dd = new DentistaDao();if(cidade == null){        System.out.println("A cidade está nula o problema está aqui!");
}
dentista.setCidade(cidade); if (validadorCampos()) { if (dd.cadastraDentista(dentista)) { lista = pd.listarDentistas(); return "sucessoDentista"; } else return "erro"; } else { return "incorreto"; } }Se no console não imprimir essa linha de código então talvez seu mapeamneto do hibernate não esteja 100%, altera o mapeamento do hibernate para aquele que te passei, pois uso em uma aplicação minha e tenho certeza que funciona.

Att Davi
Responder

Gostei + 0

12/11/2010

Davi Costa

Altera na sua página:

<td colspan="2"><s:select list="cidades" name="cidade.cidade."/></td>

Para :
<td colspan="2"><s:select list="cidades" name="cidade"/></td>

É por isso que a cidade está chegando null.

Att Davi
Responder

Gostei + 0

12/11/2010

Vanessa

Se no console não imprimir essa linha de código então talvez seu mapeamneto do hibernate não esteja 100%, altera o mapeamento do hibernate para aquele que te passei, pois uso em uma aplicação minha e tenho certeza que funciona.

Att Davi
    Davi, realmente não imprimiu a linha, então eu fiz as alteraçoes do mapeamento e agora deu este erro na hora que executei:   description The server encountered an internal error () that prevented it from fulfilling this request. exception javax.servlet.ServletException: org.hibernate.PropertyValueException: not-null property references a null or transient value: bean.Dentista.cidade org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:518) org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421) root cause org.hibernate.PropertyValueException: not-null property references a null or transient value: bean.Dentista.cidade org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)...... org.hibernate.PropertyValueException: not-null property references a null or transient value: bean.Dentista.cidade
Responder

Gostei + 0

12/11/2010

Davi Costa

Altera a página conforme eu sugeri, e ve se continua dando erro, se não testa assim:
Aletra a página para ficar desse modo.

<td colspan="2"><s:select list="cidades" name="dentista.cidade"/></td>

E no seu Action :
public String inserirDentista() { DentistaDao dd = new DentistaDao();//retirado esse trecho antigo e coloca esse para testar
if(dentista.getCidade() != null ){
    System.out.println("Problema de cidade vir null está corrigido.");
}
if (validadorCampos()) { if (dd.cadastraDentista(dentista)) { lista = pd.listarDentistas(); return "sucessoDentista"; } else return "erro"; } else { return "incorreto"; } }
Responder

Gostei + 0

12/11/2010

Vanessa

Nossa!!! Como está complicado pra mim!!! Já fiz todas as alteraçoes que vc sugeriu e nada... agora só dá aquele erro. vou assistir a video aula sobre mapeamento do hibernate, muitos para um, pra ver no que estou errando.   É a primeira vez que tento fazer algo assim e estou passando mal pra aprender.   Davi, muito obrigada pela ajuda. Se eu consegui resolver, posto aqui aonde eu estou errando tá!!! vlw mesmo, pelo menos já sei que o erro é no mapeamento.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar