Amigos,
Estou postando porque não consigo enxergar o erro. Não consigo “salvar” o valor deste SelectOneMenu gerado a partir de uma consulta hibernate.
Ele até exibe os itens no select, mas quando clico no botão Salvar, ele não cadastra. No console, aparece uma consulta do hibernta. E só.
A entidade é Cartão, e cada Cartão possui um Cliente. Na tela de Cadastro de Cartão, aparece a lista com todos os clientes, daí devo selecionar um e continuar o cadastro.
Vejam o código:
@Entity
public class Cartao {
@Id
@GeneratedValue
private int id;
private String numero;
private int tipoCartao;
private Date dataEmissao;
private Date dataValidade;
private Date dataVencimento;
private double limite;
private boolean valido;
@ManyToOne
private Cliente cliente;
public Cartao() {
super();
}
//construtor e getters e setters
No JSP:
<h:panelGrid columns="3">
<h:outputText value="Selecione o cliente: " />
<h:selectOneMenu id="cliente" value="#{cartaoBean.idCliente}">
<f:selectItems value="#{cartaoBean.listaClientes}" />
</h:selectOneMenu>
<h:message for="cliente" style="color: darkred" />
//outros itens
</h:panelGrid>
<h:commandButton action="#{cartaoBean.salvar}" value="Salvar" />
Agora o ManagedBean:
public class CartaoBean {
private Cartao cartao = new Cartao();
private Cliente cliente = new Cartao();
private List<Cliente> listaClientes = new ArrayList<Cliente>();
private int idCliente;
public String salvar() {
System.out.println("PONTO &&&&&&&&&&&&&&&&&&&&&&&&");
Session s = HibernateUtil.getSession();
Transaction t = s.beginTransaction();
for (Cliente c : listaClientes) {
if (c.getId() == this.idCliente) {
this.cliente = c;
}
}
cartao.setCliente(cliente);
s.save(cartao);
t.commit();
s.close();
cartao = new Cartao();
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("Cadastro de cartão efetuado com sucesso"));
return "salvar";
}
public Cartao getCartao() {
return cartao;
}
public void setCartao(Cartao cartao) {
this.cartao = cartao;
}
public List<SelectItem> getListaClientes() {
Session s = HibernateUtil.getSession();
Transaction t = s.beginTransaction();
Query q = s.createQuery("from Cliente");
List<Cliente> listaCliente = q.list();
s.close();
List<SelectItem> listaSelectCliente = new ArrayList<SelectItem>();
for (Cliente c : listaCliente) {
listaSelectCliente.add(new SelectItem(c.getId(), c.getNome()));
}
return listaSelectCliente;
}
public int getIdCliente() {
return idCliente;
}
public void setIdCliente(int idCliente) {
this.idCliente = idCliente;
}
}
O getListaClientes() faz ok, porque os nomes dos clientes aparecem no Select.
O pró é quando clico em Salvar… no console nem aparece o “PONTO &&&&&…”, só um trecho selectdo hibernate.
O que pode estar acontecendo?
valeu