Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Como utilizar SelectManyCheckBox para salvar dados no banco

XHTML


                                        <p:selectCheckboxMenu id="multiple"
                                            value="#{medicoBeanView.objetoSelecionado.especialidades}"
                                            label="Especialidades" multiple="true" filter="true" 
                                            filterMatchMode="startsWith" panelStyle="width:250px" >
                                            <f:selectItems 
                                                value="#{especialidadeBeanView.especialidades}" />
                                        </p:selectCheckboxMenu>
Converter
  @FacesConverter(forClass = Especialidade.class) public class
  EspecialidadeConverter implements Converter, Serializable{

  private static final long serialVersionUID = 1L;

  @Override public Object getAsObject(FacesContext arg0, UIComponent arg1,
  String codigo) { if (codigo != null && !codigo.isEmpty()){ return
  (Especialidade) HibernateUtil.getCurrentSession().get(Especialidade.class,
  new Long(codigo)); } return codigo; }

  @Override public String getAsString(FacesContext arg0, UIComponent arg1,
  Object objeto) { if (objeto != null){ Especialidade c = (Especialidade)
  objeto; return c.getIdEspecialidade() != null && c.getIdEspecialidade() > 0 ?
  c.getIdEspecialidade().toString() : null; } return null; }

  }
Medico Model
@ManyToMany
    @JoinTable(name="medico_especialidade",    
    joinColumns={@JoinColumn(name="idMedico")},    
    inverseJoinColumns={@JoinColumn(name="idEspecialida")})  
    private List<Especialidade>  especialidades = new ArrayList<Especialidade>();
Especialidade Model

    @ManyToMany(mappedBy = "especialidades", cascade = CascadeType.ALL)    
    private List<Medico> medicos = new ArrayList<>();

Especialidade Controller

public List<SelectItem> getListEspecialidades() throws Exception {
        List<SelectItem> list = new ArrayList<SelectItem>();

        List<Especialidade> especialidades = super.findListByQueryDinamica(" from Especialidade");

        for (Especialidade especialidade : especialidades) {
            list.add(new SelectItem(especialidade,especialidade.getNomeEspecialidade()));
        }
        return list;
    }
Especialidade Bean View
public List<SelectItem> getEspecialidades() throws Exception {
    return especialidadeController.getListEspecialidades();
}
Erro da pilha 

javax.el.ELException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.projeto.model.classes.Especialidade.idEspecialidade
    at com.sun.el.parser.AstValue.invoke(AstValue.java:238)
    at 
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field br.com.projeto.model.classes.Especialidade.idEspecialidade to java.lang.String
4 respostas
javax.el.ELException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.projeto.model.classes.Especialidade.idEspecialidade

Você está enviando Long para o getAsObject, troque o código para:

getAsObject(FacesContext arg0, UIComponent arg1,
  Long codigo)

Na sua classe Especialidade olhe se você tem um método getIdEspecialidade retornando o tipo correto do seu mapeamento

Como pode ver contenho o set e get de idEspecialidade

Classe Especialidade
@Entity
@Audited
@Table(name="especialidade")
@SequenceGenerator(name="especialidade_seq", sequenceName="especialidade_seq", initialValue = 1, allocationSize = 1)
public class Especialidade implements Serializable {

    private static final long serialVersionUID = 1L;

    @IdentificaCampoPesquisa(descricaoCampo = "Código", campoConsulta ="idEspecialidade", principal = 1 )
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,    generator = "especialidade_seq")
    private Long idEspecialidade;

    @IdentificaCampoPesquisa(descricaoCampo = "Especialidade", campoConsulta = "nomeEspecialidade", principal = 2)
    private String nomeEspecialidade;

    private String observacao;

    @Version
    @Column(name = "versionNum")
    private int versionNum;

    @ManyToMany(mappedBy="especialidades")
    private List<Medico>  medicos = new ArrayList<>();

    //EQUALS E HASCODE ----------------------------------------

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((idEspecialidade == null) ? 0 : idEspecialidade.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;
        Especialidade other = (Especialidade) obj;
        if (idEspecialidade == null) {
            if (other.idEspecialidade != null)
                return false;
        } else if (!idEspecialidade.equals(other.idEspecialidade))
            return false;
        return true;
    }

    //GETTERS E SETTERS----------------------------------------------

    public Long getIdEspecialidade() {
        return idEspecialidade;
    }
    public void setIdEspecialidade(Long idEspecialidade) {
        this.idEspecialidade = idEspecialidade;
    }

Tentei fazer a alteração que me propôs porém o método está sendo @Override da interface javax.faces.convert.Converter

O getAsObject e o getAsString

solução

Resolvido Alterando o Converter para :

@FacesConverter( value="especialidadeConverter",forClass = Especialidade.class)
public class EspecialidadeConverter implements Converter, Serializable {

    private static final long serialVersionUID = 1L;

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {

        if (value != null) {
            //Long codigo = new Long(value); 
            try {
                return new EspecialidadeController().findByPorId(Especialidade.class, Integer.valueOf(value).longValue());
            } catch (Exception e) {
                return new Especialidade();
            }
        }
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
         try {
                return String.valueOf(((Especialidade) value).getIdEspecialidade());
            } catch (Exception e) {
                return "";
            }
        }
            }

Fala Humberto

No getAsObject você também poderia verificar se o value é null e simplesmente retornar ele:


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