Problema para cadastrar dados - JSF + Hibernate
25/11/2010
0
Estou com um probleminha na hora de cadastrar os dados de um form no banco
quando eu clico no botao enviar...
nao acontece nada
no log do tomcat a unica coisa q mostra é uma listagem q tem na pagina
nao mostra nada referente ao insert.
Eu tenho os combobox "bairro" e "enderecos"
o endereco depende do bairro
quando mando fazer o submit com o campo endereço em branco
o log do tomcat me mostra a mensagem de erro q o campo nao pod ser nulo
mais se passo um valor ai nao mostra nada.
no meu banco deveria apenas receber o valor de enderecos e cadastrar na tabela ocorrencia.
minha pagina xhtml esta assim
<h:form>
<h:panelGrid styleClass="rsPanel" width="250" columns="2" columnClasses="scriptdemocolumn-l,scriptdemocolumn-r">
<h:outputText styleClass="rsLabel" value="Data:" />
<rich:calendar datePattern="dd/MM/yy" required="true" value="#{ocorrencias.ocorrencia.data}" inputStyle="width:5em" />
<h:outputText styleClass="rsLabel" value="Hora:" />
<h:inputText styleClass="rsInput" value="#{ocorrencias.ocorrencia.hora}" >
<f:convertDateTime pattern="hh:mm"/></h:inputText>
<h:outputText styleClass="rsLabel" value="Referencia:" />
<h:inputText styleClass="rsInput" value="#{ocorrencias.ocorrencia.referenciaLocal}" />
<h:outputText styleClass="rsLabel" value="Bairro:" />
<h:selectOneMenu id="status" value="#{enderecos.idBairro}">
<f:selectItems value="#{enderecos.comboBairros}" />
<a4j:support event="onchange" ajaxSingle="true" reRender="enderecos"/>
</h:selectOneMenu>
<h:outputText styleClass="rsLabel" value="Logradouro:" />
<h:selectOneMenu id="enderecos" value="#{ocorrencias.ocorrencia.endereco.id}">
<f:selectItems value="#{enderecos.comboEnderecos}" />
</h:selectOneMenu>
<h:outputText styleClass="rsLabel" value="Tipo de Ocorrência:" />
<h:selectOneMenu id="tipoDeOcorrencia" value="#{ocorrencias.ocorrencia.tipoDeOcorrencia.id}">
<f:selectItems value="#{tipodeocorrencia.comboTiposDeOcorrencia}" />
</h:selectOneMenu>
<rich:spacer height="5"/>
<a4j:commandButton value="Inserir" action="#{ocorrencias.merge}" reRender="formCadastros, listOcorrencias" status="sts" styleClass="botoes"/>
<f:facet name="footer">
</f:facet>
</h:panelGrid>
</h:form>
e o meu Bean esta assim
public class OcorrenciaBean {
private Ocorrencia ocorrencia = new Ocorrencia();
private Long id;
public OcorrenciaBean() {
ocorrencia.setDataHoraRegistro(new Date());
ocorrencia.setTipoDeOcorrencia(new TipoDeOcorrencia());
ocorrencia.setEndereco(new Endereco());
}
public void setOcorrencia(Ocorrencia ocorrencia) {
this.ocorrencia = ocorrencia;
}
public Ocorrencia getOcorrencia() {
return ocorrencia;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String merge() {
System.out.println(" AAAKKIIIIIIIII ---> " + this.ocorrencia.getEndereco().getEndereco());
OcorrenciaFacade ocorrenciaService = new OcorrenciaFacadeImpl();
ocorrenciaService.atualiza(this.ocorrencia);
this.ocorrencia = new Ocorrencia();
return "atualizaSucesso";
}
}
Alguem sabe me dizer mais ou menos o que esta acontecendo? Oo
desde ontem quebrando a cabeça com isso e ainda nao saiu nada =Z
grato pela atenção
Erickson Sousa
Posts
03/12/2010
Rodrigo Andrade
Seu método merge está atualizar ao invés de salvar para um novo endereço... vc colocou persist ou merge no dao?
Segundo vc não colocou a classe endereço para agente avaliar se tem algo errado;
Terceiro vc passa quais os valores para a modificação do id do endereço no combo ( o obejto ou apenas o id)?
06/12/2010
Erickson Sousa
vamos lah
-- vc colocou persist ou merge no dao?
o .xhtml
<h:outputText styleClass="rsLabel" value="Bairro:" />
<h:selectOneMenu id="status" value="#{enderecos.idBairro}">
<f:selectItems value="#{enderecos.comboBairros}" />
<a4j:support event="onchange" ajaxSingle="true" reRender="enderecos"/>
</h:selectOneMenu>
<h:outputText styleClass="rsLabel" value="Logradouro:" />
<h:selectOneMenu id="enderecos" value="#{ocorrencias.ocorrencia.endereco.id}">
<f:selectItems value="#{enderecos.comboEnderecos}" />
</h:selectOneMenu>
<a4j:commandButton value="Inserir" action="#{ocorrencias.merge}" reRender="formCadastros, listOcorrencias" status="sts" styleClass="botoes"/>
o bean
private Ocorrencia ocorrencia = new Ocorrencia();
private Long id;
public OcorrenciaBean() {
ocorrencia.setDataHoraRegistro(new Date());
ocorrencia.setTipoDeOcorrencia(new TipoDeOcorrencia());
ocorrencia.setEndereco(new Endereco());
}
public String merge() {
OcorrenciaFacade ocorrenciaService = new OcorrenciaFacadeImpl();
ocorrenciaService.atualiza(this.ocorrencia);
this.ocorrencia = new Ocorrencia();
return "Sucesso";
}
o facade
public void atualiza(Ocorrencia o) {
sf = new AnnotationConfiguration().configure().buildSessionFactory();
session = sf.openSession();
tx = session.beginTransaction();
ocorrenciaDAO = new OcorrenciaDAO(session, Ocorrencia.class);
this.ocorrenciaDAO.merge(o);
tx.commit();
session.close();
}
o DAO
public void merge(T t) {
logger.info("Salvando ou atualizando " + t);
session.merge(t);
}
No DAO o realmente esta sendo utilizado é o merge().
-- a classe endereço para agente avaliar se tem algo errado
O bean
private BairroFacade listaBairro;
private EnderecoFacade listaRua;
private List<SelectItem> items = null;
private List<SelectItem> itensBairro = new ArrayList<SelectItem>();
private List<SelectItem> itensRua = new ArrayList<SelectItem>();
private Long idBairro = (long) 0;
public List<SelectItem> getComboBairros() {
listaBairro = new BairroFacadeImpl();
itensBairro = new ArrayList<SelectItem>();
itensBairro.add(new SelectItem("", "Selecione um bairro"));
for (Bairro bairro : listaBairro.lista()) {
itensBairro.add(new SelectItem(bairro.getId().toString(), bairro.getBairro()));
}
return itensBairro;
}
public List<SelectItem> getComboEnderecos() {
listaRua = new EnderecoFacadeImpl();
itensRua.add(new SelectItem("", "Selecione um logradouro"));
for (Endereco endereco : listaRua.pesquisaEnderecoByBairro(idBairro)) {
itensRua.add(new SelectItem(endereco.getId().toString(), endereco.getEndereco()));
}
return itensRua;
}
-- ( o obejto ou apenas o id)?
Segundo alguns prints q dei quando tava testando ele pegava o objeto.
O que mais poderia ta fornecendo para ajudar?
grato pela atenção
10/12/2010
Rodrigo Andrade
Vamos fazer uns teste:
Tira o toString dos métodos de combo como por exemplo: " itensBairro.add(new SelectItem(bairro.getId().toString(), bairro.getBairro()));"
Depois coloca um System out logo após o início do método merge, para ver se ele está sendo executado:
ublic String merge() {
System.out.println("Estou sendo executado!");
OcorrenciaFacade ocorrenciaService = new OcorrenciaFacadeImpl();
ocorrenciaService.atualiza(this.ocorrencia);
this.ocorrencia = new Ocorrencia();
return "Sucesso";
}
A seguir, bem verifiquei que o seu bean atualiza um endereço pelo combo netão, vc pode fazer de duas formas, ou vc usa uma converter para fazer com que ele pegue aquele id de endereço selecionado, vá no banco faça uma consulta e te retorne o objeto ou vc mesmo faz isso antes de realizar o atualizar, entendeu?
10/12/2010
Dyego Carmo
Clique aqui para fazer login e interagir na Comunidade :)