Fórum Problemas com selectManyMenu #516977
16/04/2015
0
Olá, tenho um sistema onde existe um relacionamento entre candidato e perfil, onde a cardinalidade é de um relacionamento N:N. Sendo assim foram mapeadas as Classes Candidato e PerfilCandidato, com anotações ManyToMany.
//----------------------Classes-----------------------------------------
// ------------------Página JSF-----------------------------------
...
...
//------------------------ Converter -----------------------------------
Meu problema é o seguinte, ao cadastrar o candidato, com os perfis do candidato pré cadastrados, devo marca-lós no selectManyMenu para persistir seu relacionamento ao gravar candidato, no caso, ele persisti o candidato, mas não inseri o relacionamento na tabela associativa, que a anotação manyToMany nos poupa de gerenciar, mesmo selecionando os perfis no selectmanymenu. Acredito que a implementação do converter deva ser não de forma simples como achamos muitas implementações na internet, porém tive dificuldade de encontrar uma solução para este problema e entender o funcionamento do selectmanymenu. Como devo proceder para resolver está situação?
Se tem algum artigo, pocket ou curso que aborde está situação com mais clareza?
Desde já grato.
//----------------------Classes-----------------------------------------
@Entity
@Table(name = "tb_perfilcandidato")
public class PerfilCandidato implements java.io.Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "pca_id")
private Integer pcaId;
@Size(min = 1, max = 100)
@Column(name = "pca_descricao")
private String pcaDescricao;
@OneToMany(mappedBy = "cargo",fetch = FetchType.LAZY)
List<Vaga> vagas = new LinkedList<Vaga>();
@ManyToMany(targetEntity = Candidato.class,mappedBy = "perfis")
@JoinTable(name = "tb_Candidato_perfilcandidato")
private List<Candidato> candidatos = new LinkedList<Candidato>();
//Contrutores
//Getter e setters
//Equals e hashcode
}
@Entity
@Table(name = "tb_candidato")
public class Candidato implements java.io.Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "can_id")
private Integer canId;
//Dados Pessoais
@Size(min = 1, max = 100)
@Column(name = "can_nomeCompleto")
private String canNomeCompleto;
@Size(min = 1, max = 15)
@Column(name = "can_rg")
private String canRg;
@Size(min = 1, max = 14)
@Column(name = "can_cpf")
private String canCpf;
@Column(name = "can_sexo")
private Character canSexo;
@Column(name = "can_dtNasc")
@Temporal(javax.persistence.TemporalType.DATE)
private Date candtNasc;
@Size(min = 1, max = 13)
@Column(name = "can_celular")
private String canCelular;
@Size(max = 13)
@Column(name = "can_telResidecial")
private String cantelResidecial;
@Size(min = 1, max = 100)
@Column(name = "can_email")
private String canEmail;
//Endereço
@Size(min = 1, max = 200)
@Column(name = "can_endereco")
private String canEndereco;
@Column(name = "can_numero")
private int canNumero;
@Size(max = 50)
@Column(name = "can_complemento")
private String canComplemento;
@Size(min = 1, max = 100)
@Column(name = "can_bairro")
private String canBairro;
@Size(min = 1, max = 100)
@Column(name = "can_cidade")
private String canCidade;
@Size(min = 1, max = 10)
@Column(name = "can_cep")
private String canCep;
@Size(min = 1, max = 2)
@Column(name = "can_uf")
private String canUf;
//Relacionamento
@OneToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name = "can_usuario",nullable = false)
private Usuario usuario;
@OneToMany(mappedBy = "candidato",fetch = FetchType.LAZY)
private List<Recrutado> recrutados = new LinkedList<Recrutado>();
@ManyToMany(targetEntity = PerfilCandidato.class)
@JoinTable(name = "tb_Candidato_perfilcandidato",
joinColumns =@JoinColumn(name = "cpc_id_candidato",referencedColumnName = "canId",nullable = false),
inverseJoinColumns =@JoinColumn(name = "cpc_id_perfilcandidato",referencedColumnName = "pcaId",nullable = false))
private List<PerfilCandidato> perfis = new LinkedList<PerfilCandidato>();
//Contrutores
//Getter e setters
//Equals e hashcode
}
// ------------------Página JSF-----------------------------------
...
<p:panel header="Perfis" >
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputLabel for="perfis" value="Perfil: " />
<p:selectManyMenu id="perfis"
value="#{candidatoControl.candidato.perfis}"
converter="PerfilCandConverter">
<f:selectItems value="#{perfilCandidatoControl.perfilsCandidatos}" var="perfil" itemLabel="#{perfil.pcaDescricao}" itemValue="#{perfil }" />
</p:selectManyMenu>
</h:panelGrid>
</p:panel>
...
//------------------------ Converter -----------------------------------
@FacesConverter(value = "PerfilCandConverter",forClass = PerfilCandidato.class)
public class PerfilCandidatoConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value != null && value instanceof String){
return new PerfilCandidatoService().findPerfilCandidatoByCod(Integer.parseInt(value));
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if(value != null && value instanceof PerfilCandidato){
return String.valueOf(((PerfilCandidato)value).getPcaId());
}
return null;
}
}
Meu problema é o seguinte, ao cadastrar o candidato, com os perfis do candidato pré cadastrados, devo marca-lós no selectManyMenu para persistir seu relacionamento ao gravar candidato, no caso, ele persisti o candidato, mas não inseri o relacionamento na tabela associativa, que a anotação manyToMany nos poupa de gerenciar, mesmo selecionando os perfis no selectmanymenu. Acredito que a implementação do converter deva ser não de forma simples como achamos muitas implementações na internet, porém tive dificuldade de encontrar uma solução para este problema e entender o funcionamento do selectmanymenu. Como devo proceder para resolver está situação?
Se tem algum artigo, pocket ou curso que aborde está situação com mais clareza?
Desde já grato.
Gabriell Amaral
Curtir tópico
+ 0
Responder
Posts
12/02/2016
Vinicius Galdini
Estou com o mesmo problema aqui descrito. Alguém tem a solução?
Muito obrigado.
Muito obrigado.
Responder
Gostei + 0
19/02/2016
Gabriell Amaral
Prezado Galdini,
Neste projeto que implementei acabei pesquisando um bom tempo na internet, porém não achei uma solução pronta para isso, já que temos um componente JSF que pode pode selecionar vários, assim dando a possibilidade de relaciona muito com muito ou um para muitos. Acabei adotando um paliativo, confesso que não fiquei tão feliz, achei que seria mais fácil,mas foi o que me veio a fazer para resolver o problema. Espero ajudar.
Primeiro, como não consegue ver uma implementação de converter que atende-se minha regra de muitos para muitos entre as entidades candidato e perfil de caandidato, adotei a seguinte variável na managebean que foi utilizada para está funcionalidade:
Desta forma foi possível construir o seguinte componente JSF:
>
Isto posto, foi possível obter todos os códigos que foram selecionado a partir do componente selectManyMenu, com isso ao finalizar o cadastro do candidato consegui converter está lista de String com código como seu conteúdo em entidades de perfil de candidatos, usando os seguintes código para converter, relacionar e finalizar o cadastro:
Deste modo,consegue obter a lógica para cadastrar e atualizar a lista de perfis que eram vinculadas ao candidato. Espero que aproveite a explanação.
Neste projeto que implementei acabei pesquisando um bom tempo na internet, porém não achei uma solução pronta para isso, já que temos um componente JSF que pode pode selecionar vários, assim dando a possibilidade de relaciona muito com muito ou um para muitos. Acabei adotando um paliativo, confesso que não fiquei tão feliz, achei que seria mais fácil,mas foi o que me veio a fazer para resolver o problema. Espero ajudar.
Primeiro, como não consegue ver uma implementação de converter que atende-se minha regra de muitos para muitos entre as entidades candidato e perfil de caandidato, adotei a seguinte variável na managebean que foi utilizada para está funcionalidade:
List<String> selectOptions;
Desta forma foi possível construir o seguinte componente JSF:
<h:outputLabel for="perfis" value="Perfis: " />
<p:selectManyMenu id="perfis"
value="#{candidatoControl.selectOptions}"
filter="true"
showCheckbox="true"
required="true"
requiredMessage="Informe ao menos um perfil para o Candidato.">
<f:selectItems value="#{perfilCandidatoControl.perfilsCandidatos}" var="perfil" itemLabel=" #{perfil.pcaDescricao}" itemValue="#{perfil.pcaId}" />
</p:selectManyMenu
Isto posto, foi possível obter todos os códigos que foram selecionado a partir do componente selectManyMenu, com isso ao finalizar o cadastro do candidato consegui converter está lista de String com código como seu conteúdo em entidades de perfil de candidatos, usando os seguintes código para converter, relacionar e finalizar o cadastro:
public String finishPersist(){
List<PerfilCandidato> perfis = getPerfilCandidatoByCodSelected();
if(!perfis.isEmpty()){
getCandidato().setPerfis(perfis);
}
getService().persist(getCandidato());
return "listCandidato.faces?faces-redirect=true";
}
public List<PerfilCandidato> getPerfilCandidatoByCodSelected(){
if(getSelectOptions() != null){
return new PerfilCandidatoService().getPerfilCandidatoByCodSelected(getSelectOptions());
}
return null;
}
public List<PerfilCandidato> getPerfilCandidatoByCodSelected(List<String> selectOptions){
List<PerfilCandidato> lista = new LinkedList<PerfilCandidato>();
for (String cod : selectOptions) {
lista.add(findPerfilCandidatoByCod(Integer.parseInt(cod)));
}
return lista;
}
Deste modo,consegue obter a lógica para cadastrar e atualizar a lista de perfis que eram vinculadas ao candidato. Espero que aproveite a explanação.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)