Olha estou vendo que vc esta passando o Nome do Cliente e o ID do cliente, isto não é necessario, vc precisa passar
o nome do Cliente e o Objeto Cliente.
no momento de Gravar o conversor deverá chamar o metodo getAsObject ou seja ira transformar em Objeto para que
possa ser salvo no banco,
vamos passo a passo então vou começar das classes entidade usando um exemplo de Municipio e Estado
trecho de codigo da classe Municipio.Java mostrando o relacionamento
//bi-directional many-to-one association to Estado
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_estado")
private Estado estado;
Estado.java Observe o metodo toString porque ele será necessario
@Id
@Column(name="id_estado")
private String idEstado;
@Column(name="ds_estado")
private String dsEstado;
//bi-directional many-to-one association to Municipio
@OneToMany(mappedBy="estado")
private List<Municipio> municipios;
@Override
public String toString() {
return dsEstado;
}
Vamos agora relembrar como esta a minha pagina note que ela chama um metodo estadoC.itemsAvailableSelectOne
estadoC é o meu MB
<h:outputLabel for="nome" value="Nome:" />
<h:inputText id="nome" value="#{municipioC.municipio.dsMunicipio}" style=" width : 450px;"/>
<h:outputLabel for="estado" value="Uf:" />
<h:selectOneMenu id="estado" value="#{municipioC.municipio.estado}" >
<f:selectItems value="#{estadoC.itemsAvailableSelectOne}"
var="item"
itemValue="#{item}"
itemLabel="#{item.dsEstado}" />
</h:selectOneMenu>
Vamos ver um trecho de EstadoController.java
@ManagedBean(name="estadoC")
@SessionScoped
public class EstadoController {
private Estado estado;
private List<Estado> estadoLista;
private int totalRegistros;
@ManagedProperty(value = "#{estadoService}")
private EstadoService estadoService;
public SelectItem[] getItemsAvailableSelectOne() {
return FacesUtil.getSelectItems(estadoService.findAll(), true);
}
@FacesConverter(forClass = Estado.class)
public static class EstadoControllerConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
if (value == null || value.length() == 0) {
return null;
}
EstadoController controller = (EstadoController) facesContext.getApplication().getELResolver().
getValue(facesContext.getELContext(), null, "estadoC");
return controller.estadoService.findByID(getKey(value));
}
so para não ficar duvidas vamos ver o metodo getSelectItems na classe FacesUtil
observe a variavel X que será o objeto Estado e x.toString() será a descricao do estado ( veja na classe Estado.java )
public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
int size = selectOne ? entities.size() + 1 : entities.size();
SelectItem[] items = new SelectItem[size];
int i = 0;
if (selectOne) {
items[0] = new SelectItem("", "---");
i++;
}
for (Object x : entities) {
items[i++] = new SelectItem(x, x.toString());
}
return items;
}
bem… o que posso dizer mais… há reveja na pagina a tag
<h:selectOneMenu id=“estado” value="#{municipioC.municipio.estado}" >
observe que o MB municipioController.java nomeado para municipioC temos ai o atributo estado que faz parte de nossa entidade Municipio.Java
bem acho que tá tudo ai, o lance é o converter que esta em EstadoController.java
cheque isto no seu codigo que ira dar certo com Certeza.
Qualquer coisa é so mandar