Hello everyone. I have a problem when I store cattle data in the bank. The situation is as follows: I'm with two SelectOneMenu on my screen where one is dependent on the other. One is to indicate the type and the other to indicate the breed of a cattle. On dependency, I've managed to do it right, but when I save, in the database, in the race field, the whole object is being saved instead of saving only the race name. I want you to save only the race name.
Below are the codes that are related to the xhtml page. I believe the problem is in the LoadBack of CadenaBeanBean or one of the two converters.
CadastroGado.xhtml
<ui:define name="titulo">#{cadastroGadoBean.editando ? "Edição de Gado" : "Novo Gado"}</ui:define>
<ui:define name="corpo">
<f:metadata>
<o:viewParam name="gado" value="#{cadastroGadoBean.gado}"/>
<f:event listener="#{cadastroGadoBean.inicializar}" type="preRenderView"/>
</f:metadata>
<h:form>
<h1>#{cadastroGadoBean.editando ? "Edição de Gado" : "Novo Gado"}</h1>
<p:messages autoUpdate="true" closable="true" />
<p:toolbar style="margin-top: 20px">
<p:toolbarGroup>
<p:button value="Novo" outcome="/gado/CadastroGado" />
<p:commandButton value="Salvar" id="botaoSalvar"
action="#{cadastroGadoBean.salvar}" update="@form" />
</p:toolbarGroup>
<p:toolbarGroup align ="right">
<p:button value="Pesquisar" outcome="/gado/PesquisaGado"/>
</p:toolbarGroup>
</p:toolbar>
<p:panelGrid columns="2" id="painel"
style="width: 100%; margin-top: 20px" columnClasses="rotulo, campo">
<p:outputLabel value="TipoGado" for="tipogado"/>
<p:selectOneMenu id="tipogado" value="#{cadastroGadoBean.gado.tipogado}" label="Tipo"
required="true" requiredMessage="Informe o tipo do gado">
<f:selectItem itemLabel="" noSelectionOption = "true"/>
<f:selectItems
value="#{cadastroGadoBean.listTipo}" var="tipogado"
itemValue="#{tipogado}" itemLabel="#{tipogado.nomeTipo}" />
<p:ajax listener="#{cadastroGadoBean.carregarRacas}" update="gadoRaca"/>
</p:selectOneMenu>
<p:outputLabel value="Raca" for="gadoRaca"/>
<p:selectOneMenu id="gadoRaca" value="#{cadastroGadoBean.gado.gadoRaca}" required="true" requiredMessage="Informe a raça do gado">
<f:selectItem itemLabel=""/>
<f:selectItems value="#{cadastroGadoBean.listRaca}" var ="raca"
itemValue="#{raca}" itemLabel="#{raca.nome}"/>
</p:selectOneMenu>
<p:outputLabel value="Peso(em Kg)" for="gadoPeso" />
<p:inputMask id="gadoPeso" size="10" maxlength="80"
value="#{cadastroGadoBean.gado.gadoPeso}" required="true" mask="999"
requiredMessage="Por favor, informe o peso do gado">
<f:convertNumber minFractionDigits="2" />
<f:validateDoubleRange minimum="1" maximum="999"/>
</p:inputMask>
<p:outputLabel value="Sexo" for="sexo" />
<p:selectOneRadio id="sexo" value="#{cadastroGadoBean.gado.sexo}" required="true"
requiredMessage="Por favor, informe o sexo do gado">
<f:selectItem itemLabel="Macho" itemValue="Macho"/>
<f:selectItem itemLabel="Fêmea" itemValue="Fêmea"/>
</p:selectOneRadio>
<p:outputLabel value="Nascimento" for="gadoNasc" />
<p:calendar id="gadoNasc" size="10" pattern="dd/MM/yyyy"
value="#{cadastroGadoBean.gado.gadoNasc}" maxdate="#{cadastroGadoBean.dataAtual}"
locale="pt_BR" required="true"
requiredMessage="Por favor, informe a data de nascimento"/>
<p:outputLabel value="Finalidade do Gado" for="gadoFinalidade" />
<p:inputText id="gadoFinalidade" size="20" maxlength="80"
value="#{cadastroGadoBean.gado.gadoFinalidade}" required="true"
requiredMessage="Por favor, informe a finalidade do gado"
validatorMessage="formato de nome inválido">
<f:validateRegex pattern="^[A-Za-záàâãéèêíïóôõöúçñÁÀÂÃÉÈÍÏÓÔÕÖÚÇÑ ]+$"/>
</p:inputText>
<p:outputLabel value="Tag" for="tag"/>
<p:selectOneMenu value="#{cadastroGadoBean.gado.tag}" label="Tag" id="tag" filter="true" filterMatchMode="contains" required="true"
requiredMessage="Informe a tag que será acoplada ao gado">
<f:selectItem itemLabel="Selecione" noSelectionOption = "true"/>
<f:selectItems
value="#{cadastroGadoBean.listTags}"
var="tag"
itemValue="#{tag}"
itemLabel="#{tag.descricao}" />
</p:selectOneMenu>
<p:outputLabel value="Usuario" for="usuario"/>
<p:selectOneMenu value="#{cadastroGadoBean.gado.usuario}" label="Usuario" id="usuario" filter="true" filterMatchMode="contains"
required="true"
requiredMessage="Informe o proprietário do gado">
<f:selectItem itemLabel="Selecione" noSelectionOption = "true"/>
<f:selectItems
value="#{cadastroGadoBean.listUsuario}"
var="usuario"
itemValue="#{usuario}"
itemLabel="#{usuario.nome}" />
</p:selectOneMenu>
</p:panelGrid>
</h:form>
</ui:define>
TaggedBean.java
@Named
@ViewScoped
public class CadastroGadoBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private TipoGadoRep tipoGados;
@Inject
private RacaRep racarep;
@Inject
private TagsRep tagsRep;
@Inject
private UsuariosRep usuarios;
@Inject
private CadastroGadoService cadastroGadoService;
private Gado gado;
private Tag tag;
private Usuario usuario;
private TipoGado tipogado;
private Raca raca;
private List<SelectItem> listTipo;
private List<SelectItem> listRaca;
private List<SelectItem> listTags;
private List<SelectItem> listUsuario;
public Date getDataAtual() {
return new Date();
}
public CadastroGadoBean() {
limpar();
}
public boolean isEditando() {
boolean resultado = false;
if (this.gado != null) {
resultado = gado.getGadoId() != null;
}
return resultado;
}
public void inicializar() {
listTipo = new ArrayList<SelectItem>();
listTags = new ArrayList<SelectItem>();
listUsuario = new ArrayList<SelectItem>();
List<TipoGado> tipos = tipoGados.raizes();
List<Tag> tags = tagsRep.raizes();
List<Usuario> listaUsu = usuarios.listaDeUsu();
for (TipoGado tg : tipos) {
SelectItem item = new SelectItem();
item.setLabel(tg.getNomeTipo());
item.setValue(tg);
listTipo.add(item);
System.out.println(listTipo);
}
for (Tag t : tags) {
SelectItem item = new SelectItem();
item.setLabel(t.getDescricao());
item.setValue(t);
listTags.add(item);
System.out.println(listTags);
}
for (Usuario u : listaUsu) {
SelectItem item = new SelectItem();
item.setLabel(u.getNome());
item.setValue(u);
listUsuario.add(item);
}
if(!isEditando()){
gado.setgadoStatus("Ativo");
}
if (this.tipogado != null) {
tipos = tipoGados.raizes();
}
}
public void limpar() {
gado = new Gado();
listTags = new ArrayList<SelectItem>();
}
public void salvar() {
this.gado = cadastroGadoService.salvar(this.gado);
limpar();
FacesUtil.addInfoMessage("Gado salvo com sucesso!");
}
public void carregarRacas(){
listRaca = new ArrayList<SelectItem>();
List<Raca> racas = racarep.racasDe(gado.getTipogado());
for (Raca r : racas) {
SelectItem item = new SelectItem();
item.setLabel(r.getNome());
item.setValue(r);
listRaca.add(item);
}
}
public Gado getGado() {
return gado;
}
public void setGado(Gado gado) {
this.gado = gado;
if (this.gado != null) {
this.tag = this.gado.getTag();
}
}
public List<SelectItem> getListTags() {
return listTags;
}
public void setListTags(List<SelectItem> listTags) {
this.listTags = listTags;
}
public List<SelectItem> getListTipo() {
return listTipo;
}
public void setListTipo(List<SelectItem> listTipo) {
this.listTipo = listTipo;
}
public List<SelectItem> getListRaca() {
return listRaca;
}
public void setListRaca(List<SelectItem> listRaca) {
this.listRaca = listRaca;
}
public Tag getTag() {
return tag;
}
public void setTag(Tag tag) {
this.tag = tag;
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public List<SelectItem> getListUsuario() {
return listUsuario;
}
public void setListUsuario(List<SelectItem> listUsuario) {
this.listUsuario = listUsuario;
}
public TipoGado getTipogado() {
return tipogado;
}
public void setTipogado(TipoGado tipogado) {
this.tipogado = tipogado;
}
public Raca getRaca() {
return raca;
}
public void setRaca(Raca raca) {
this.raca = raca;
}
}
CadastroGadoService.java
public class CadastroGadoService implements Serializable{
private static final long serialVersionUID = 1L;
@Inject
private GadosRep gados;
public Gado salvar(Gado gado){
return gados.guardar(gado);
}
@Transactional
public void excluir(Gado gado) throws NegocioException {
gado = this.gados.porId(gado.getGadoId());
this.gados.remover(gado);
}
}
GadosRep.java
public class GadosRep implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager manager;
public Gado guardar(Gado gado) {
EntityTransaction trx = manager.getTransaction();
trx.begin();
gado = manager.merge(gado);
trx.commit();
return gado;
}
@SuppressWarnings("unchecked")
public List<Gado> filtrados(GadoFilter filtro) {
Session session = manager.unwrap(Session.class);
Criteria criteria = session.createCriteria(Gado.class);
if (filtro.getGadoId() != null) {
criteria.add(Restrictions.eq("gadoId", filtro.getGadoId()));
}
if (filtro.getGadostatus() != "Ativo")
{
criteria.add(Restrictions.eq("gadoStatus", filtro.getGadostatus()));
}
return criteria.addOrder(Order.asc("tipogado")).list();
}
public Gado porId(Long id) {
return manager.find(Gado.class, id);
}
public void remover(Gado gado) {
this.manager.remove(gado);
EntityTransaction trx = manager.getTransaction();
trx.begin();
manager.flush();
trx.commit();
}
}
ConverterType.java
@FacesConverter(forClass = TipoGado.class)
public class ConverterGadoTipo implements Converter {
private TipoGadoRep tipogadosrep;
public ConverterGadoTipo() {
tipogadosrep = CDIServiceLocator.getBean(TipoGadoRep.class);
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
TipoGado retorno = null;
if (value != null) {
String nomeTipo = new String(value);
retorno = tipogadosrep.porNome(nomeTipo);
}
return retorno;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null || value.equals("")) {
return "";
} else {
String nomeTipo = ((TipoGado)value).getNomeTipo();
return String.valueOf(nomeTipo);
}
}
}
ConverterType.java
@FacesConverter(forClass = Raca.class)
public class ConverterTipoRaca implements Converter {
@Inject
private RacaRep raca;
public ConverterTipoRaca() {
raca = CDIServiceLocator.getBean(RacaRep.class);
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Raca retorno = null;
if (value != null){
String nome = new String(value);
retorno = raca.porNomeRaca(nome);
}
return retorno;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value != null){
return ((Raca) value).getNome().toString();
}
return null;
}
}
I think it's an easy error to solve, but I'm not used to working with this amount of code and it makes me hard to identify where the error is.
Thank you for any suggestions or tips.