Selectonemenu Field (Primefaces) does not save on the bank

1

I come to ask for your help again, because I need to finish my CBT. I have dialog that has multiple fields, one of them is <p:selectOneMenu> . When I pre-select all the fields and save, the fields are all saved, except the <p:selectOneMenu> field. And there is no error in stacktrace. I already debugged, I searched on Converter and a thousand other things ... and nothing to solve.

UPDATE

Looking at the Hibernate queries, I noticed that it does insert in all fields, except in helper class monografia_linhapesquisa , since I have a Manytomany relationship between Monografia and LinhaPesquisa Below the console output:

  

Hibernate:       insert       into           monography           (aluno_id, start_date, teacher_id, title)       values           (?,?,?,?)

I have the following mapping between Monografia and LinhaPesquisa . In class LinhaPesquisa I did not make any relationship

@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(name="monografia_linhapesquisa", joinColumns=
    {@JoinColumn(name="monografia_id")}, inverseJoinColumns=
    {@JoinColumn(name="linha_pesquisa_id")})
    private List<LinhaPesquisa> listaLinhaPesquisas;

My <p:selectOneMenu>

        <p:outputLabel value="Linha de Pesquisa: " for="linhaPesquisa" />
            <p:selectOneMenu id="linhaPesquisa" converter="#{gestaoMonografiasBean.linhaPesquisaConverter}"
                value="#{gestaoMonografiasBean.monografia.linhaPesquisa}" required="true" >
                <f:selectItem itemLabel="Selecione..." />
                <f:selectItems value="#{gestaoMonografiasBean.selecionarLinhaPesquisa}"
                    var="linhaPesquisa" itemLabel="#{linhaPesquisa.titulo}"
                    itemValue="#{linhaPesquisa}" />
            </p:selectOneMenu>

My method selecionarLinhaPesquisa that is in my bean , which I use to access the repository of Linha de Pesquisa , after searching the list for Converter

public List<LinhaPesquisa> getSelecionarLinhaPesquisa() {
        List<LinhaPesquisa> listaLinhaPesquisas = linhaPesquisas.todas();

        linhaPesquisaConverter = new LinhaPesquisaConverter(listaLinhaPesquisas);

        return listaLinhaPesquisas;
    }

My method that searches the bank

public List<LinhaPesquisa> todas() {
        return manager.createQuery("from LinhaPesquisa", LinhaPesquisa.class).getResultList();
   }

And finally my Converter , which I think is working normal, as I debugged and saw that getAsObject arrives at id referring to Linha de Pesquisa selected, but not saved in the database.

package com.daniel.monografia.controller.converter;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import com.daniel.monografia.model.LinhaPesquisa;

public class LinhaPesquisaConverter implements Converter {

    private List<LinhaPesquisa> listaLinhaPesquisas;



    public LinhaPesquisaConverter(List<LinhaPesquisa> listaLinhaPesquisas) {
        this.listaLinhaPesquisas = listaLinhaPesquisas;
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        System.out.println("Objeto linha pesquisa: " + value);
        if (value == null || value.isEmpty()) {
            throw new ConverterException("Erro de Conversão: value null ou vazio");

        }

         Long id = Long.valueOf(value);

         for(LinhaPesquisa linhaPesquisa: listaLinhaPesquisas){
         if(id.equals(linhaPesquisa.getId())){ 
             return linhaPesquisa; 
            } 
         }

         return null;

    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        System.out.println("Strinh linha de pesquisa: "+value);

        if(value == null){
            return "";
        }

        try{
            if(value instanceof LinhaPesquisa && value != null){

                return String.valueOf(((LinhaPesquisa) value).getId());
            }else{

            }
        }catch(NumberFormatException e){
            throw new ConverterException(new FacesMessage(String.format("Selecione uma Linha de Pesquisa", value)), e);
        }
        return null;

    }

}

My method for fetching the list of Linhas de Pesquisa from my bean , which takes objects to persist in object monografia

public List<LinhaPesquisa> getSelecionarLinhaPesquisa() {
        List<LinhaPesquisa> listaLinhaPesquisas = linhaPesquisas.todas();

        linhaPesquisaConverter = new LinhaPesquisaConverter(listaLinhaPesquisas);

        return listaLinhaPesquisas;
    }

The method todas() in repository linhasPesquisas

public List<LinhaPesquisa> todas() {
        return manager.createQuery("from LinhaPesquisa", LinhaPesquisa.class).getResultList();
   }

The bean GestaoMonografiasBean complete

package com.daniel.monografia.controller;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.convert.Converter;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.context.RequestContext;

import com.daniel.monografia.controller.converter.AlunoConverter;
import com.daniel.monografia.controller.converter.LinhaPesquisaConverter;
import com.daniel.monografia.controller.converter.ProfessorConverter;
import com.daniel.monografia.model.Aluno;
import com.daniel.monografia.model.LinhaPesquisa;
import com.daniel.monografia.model.Monografia;
import com.daniel.monografia.model.Pessoa;
import com.daniel.monografia.model.Professor;
import com.daniel.monografia.repository.Alunos;
import com.daniel.monografia.repository.LinhaPesquisas;
import com.daniel.monografia.repository.Monografias;
import com.daniel.monografia.repository.Professores;
import com.daniel.monografia.service.CadastroMonografiaService;
import com.daniel.monografia.util.FacesMessages;

@Named
@ViewScoped
public class GestaoMonografiasBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private Monografias monografias;

    @Inject
    private FacesMessages messages;

    @Inject
    private Professores professores;

    @Inject
    private Alunos alunos;

    @Inject
    private LinhaPesquisas linhaPesquisas;

    @Inject
    private CadastroMonografiaService cadastroMonografiaService;

    private List<Monografia> listaMonografias;

    private List<LinhaPesquisa> listaLinhaPesquisas;

    private String termoPesquisa;

    private Converter professorConverter;

    private Converter alunoConverter;

    private Converter linhaPesquisaConverter;

    private Monografia monografia;

    private Aluno aluno;

    private Professor professor;



    @PostConstruct
    private void iniciar() {
        monografia = new Monografia();

        aluno = new Aluno();
        this.aluno.setPessoa(new Pessoa());

        professor = new Professor();
        this.professor.setPessoa(new Pessoa());

        listaLinhaPesquisas = linhaPesquisas.todas();


    }

    public void prepararNovaMonografia() {

    }

    public void prepararEdicao() {
        professorConverter = new ProfessorConverter(Arrays.asList(monografia.getProfessor()));
        alunoConverter = new AlunoConverter(Arrays.asList(monografia.getAluno()));
    }

    public void salvar() {
        System.out.println("*********************Objeto: ***********************" + monografia);
        try {
            cadastroMonografiaService.salvar(monografia);

            atualizarRegistros();

            messages.info("Monografia salva com sucesso!");

            RequestContext.getCurrentInstance().update(Arrays.asList("frm:monografiasDataTable", "frm:messages"));

        } catch (Exception erro) {
            erro.printStackTrace();
        }
    }

    public void excluir() {
        cadastroMonografiaService.excluir(monografia);

        monografia = null;

        atualizarRegistros();

        messages.info("Monografia excluída com sucesso!");
    }

    public void pesquisar() {
        listaMonografias = monografias.pesquisar(termoPesquisa);

        if (listaMonografias.isEmpty()) {
            messages.info("Sua consulta não retornou registros.");
        }
    }

    public void todasMonografias() {
        listaMonografias = monografias.todas();
    }

    public List<Professor> completarProfessor(String termo) {
        List<Professor> listaProfessores = professores.pesquisar(termo);

        professorConverter = new ProfessorConverter(listaProfessores);

        return listaProfessores;
    }

    public List<Aluno> completarAluno(String termo) {
        List<Aluno> listaAlunos = alunos.pesquisar(termo);

        alunoConverter = new AlunoConverter(listaAlunos);

        return listaAlunos;
    }

    public List<LinhaPesquisa> getSelecionarLinhaPesquisa() {
        List<LinhaPesquisa> listaLinhaPesquisas = linhaPesquisas.todas();

        linhaPesquisaConverter = new LinhaPesquisaConverter(listaLinhaPesquisas);

        return listaLinhaPesquisas;
    }

    private void atualizarRegistros() {
        if (jaHouvePesquisa()) {
            pesquisar();
        } else {
            todasMonografias();
        }
    }

    private boolean jaHouvePesquisa() {
        return termoPesquisa != null && !"".equals(termoPesquisa);
    }

    public List<Monografia> getListaMonografias() {
        return listaMonografias;
    }

    public List<LinhaPesquisa> getListaLinhaPesquisas() {
        return listaLinhaPesquisas;
    }

    public void setListaLinhaPesquisas(List<LinhaPesquisa> listaLinhaPesquisas) {
        this.listaLinhaPesquisas = listaLinhaPesquisas;
    }

    public String getTermoPesquisa() {
        return termoPesquisa;
    }

    public void setTermoPesquisa(String termoPesquisa) {
        this.termoPesquisa = termoPesquisa;
    }

    public Converter getProfessorConverter() {
        return professorConverter;
    }

    public void setProfessorConverter(Converter professorConverter) {
        this.professorConverter = professorConverter;
    }

    public Converter getAlunoConverter() {
        return alunoConverter;
    }

    public void setAlunoConverter(Converter alunoConverter) {
        this.alunoConverter = alunoConverter;
    }

    public Converter getLinhaPesquisaConverter() {
        return linhaPesquisaConverter;
    }

    public void setLinhaPesquisaConverter(Converter linhaPesquisaConverter) {
        this.linhaPesquisaConverter = linhaPesquisaConverter;
    }

    public Monografia getMonografia() {
        return monografia;
    }

    public void setMonografia(Monografia monografia) {
        this.monografia = monografia;
    }

    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    public boolean isMonografiaSeleciona() {
        return monografia != null && monografia.getId() != null;
    }
}

The class Monografia that makes the relationship ManytoMany with class LinhaPesquisa

package com.daniel.monografia.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Table(name="monografia")
public class Monografia implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotEmpty
    @Column(nullable = false, length = 120)
    private String titulo;

    @NotNull
    @Past
    @Temporal(TemporalType.DATE)
    @Column(name = "data_inicio")
    private Date dataInicio;


    @NotNull
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "aluno_id")
    private Aluno aluno;

    @NotNull
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "professor_id")
    private Professor professor;

    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(name="monografia_linhapesquisa", joinColumns=
    {@JoinColumn(name="monografia_id")}, inverseJoinColumns=
    {@JoinColumn(name="linha_pesquisa_id")})
    private List<LinhaPesquisa> listaLinhaPesquisas; 

    @Transient
    private LinhaPesquisa linhaPesquisa;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }


    public Date getDataInicio() {
        return dataInicio;
    }

    public void setDataInicio(Date dataInicio) {
        this.dataInicio = dataInicio;
    }

    public List<LinhaPesquisa> getLinhaPesquisas() {
        return listaLinhaPesquisas;
    }

    public void setLinhaPesquisas(List<LinhaPesquisa> linhaPesquisas) {
        this.listaLinhaPesquisas = linhaPesquisas;
    }

    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    public Professor getProfessor() {
        return professor;
    }

    public void setProfessor(Professor professor) {
        this.professor = professor;
    }

    public LinhaPesquisa getLinhaPesquisa() {
        return linhaPesquisa;
    }

    public void setLinhaPesquisa(LinhaPesquisa linhaPesquisa) {
        this.linhaPesquisa = linhaPesquisa;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Monografia other = (Monografia) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Monografia [id=" + id + "]";
    }
}
    
asked by anonymous 28.11.2017 / 05:44

1 answer

1

1 - You are using the @ManyToMany mapping for a component that allows you to select only 1 record.

Solution: Switch component to selectCheckboxMenu

2 - In datatable it only shows one attribute, I want it to show all that have been selected

Solution 1: Since this field is a List, I'd suggest creating a new field in your entity that lists list information that is concatenated and comma-separated. In the get of this field, you can make a for on top of the List to return this information. Then in the dataTable, just enter that field you created.

Solution 2: You can override the ToString () method of your list and return as you want by calling the list itself in the dataTable.

    
30.11.2017 / 17:39