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 + "]";
}
}