Estou utilizando primefaces + jpa, estou tendo um problema chato de se resolver, segue o código.
Classe modelo:
package br.com.sisapropriacao.modelo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Sistema implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long idSistema;
private String nomeSistema;
private String descricao;
@ManyToOne(fetch=FetchType.EAGER)
@Embedded
private List<PerfilUsuario> usuarios = new ArrayList<PerfilUsuario>();
getters e setters....
}
package br.com.sisapropriacao.modelo;
import java.io.Serializable;
import javax.faces.bean.SessionScoped;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.validation.Valid;
@Entity
@SessionScoped
public class PerfilUsuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long idUsuario;
private String login;
private String senha;
private String nome;
private String endereco;
private String telefone;
private String rg;
private String cpf;
private String complemento;
private String bairro;
private String horaTrabalhada;
@Enumerated(EnumType.STRING)
private TipoUsuario tipoUsuario;
@Enumerated(EnumType.STRING)
private TipoFuncionario tipoFuncionario;
@Valid
@OneToOne
private Gerencia gerenciaVinculado;
getters e setters...
Bean:
package br.com.sisapropriacao.mb;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.DualListModel;
import br.com.sisapropriacao.dao.DAO;
import br.com.sisapropriacao.modelo.PerfilUsuario;
import br.com.sisapropriacao.modelo.Sistema;
@ManagedBean
@ViewScoped
public class SistemaBean implements Serializable{
private static final long serialVersionUID = 1L;
private Sistema sistema = new Sistema();
private List<Sistema> sistemas;
private DualListModel<PerfilUsuario> usuarioModel;
private PerfilUsuario perfilUsuario = new PerfilUsuario();
private List<PerfilUsuario> usuariosSelecionados = new ArrayList<PerfilUsuario>();
private List<PerfilUsuario> usuarios = new ArrayList<PerfilUsuario>();
private List<PerfilUsuario> perfilUsuarios;
public String gravar(){
DAO<Sistema> dao = new DAO<Sistema>(Sistema.class);
usuarios = usuarioModel.getSource();
usuariosSelecionados = usuarioModel.getTarget();
if(sistema.getIdSistema() == null){
sistema.setUsuarios(usuariosSelecionados);
dao.adiciona(sistema);
}else{
dao.atualiza(sistema);
}
//Lista os dados em tempo real com o banco
this.sistemas = dao.listaTodos();
//Quando for adicionar chama-se denovo o metodo para limpar os campos
this.sistema = new Sistema();
return "cadastroSistema?faces-redirect=true";
}
@PostConstruct
public void carregaUsuarios() {
System.out.println("Carregando usuários...");
perfilUsuarios = new DAO<PerfilUsuario>(PerfilUsuario.class).listaTodos();
}
public List<PerfilUsuario> getPerfilUsuarios() {
return perfilUsuarios;
}
public DualListModel<PerfilUsuario> getUsuarioModel(){
if(this.usuarioModel==null){
this.usuarioModel = new DualListModel<PerfilUsuario>(getPerfilUsuarios(), new ArrayList<PerfilUsuario>());
}
return this.usuarioModel;
}
getters e setters....
}
Então galera, da forma que está eu consigo listar os perfilUsuarios " Nome " e consigo recuperar os que são selecionados usuariosSelecionados = usuarioModel.getTarget();
só que ná hora que vou gravar ou setar os usuários selecionados sistema.setUsuarios(usuariosSelecionados);
ele me informa que não consegue converter
String para Long, isso ocorre porque no mapeamento @ManyToOne ele já cria automaticamente a tabela de relacionamento sendo o campo de vinculação um Long. Então galera,
gostaria de saber como eu posso fazer para poder gravar somente a ID desses PerfilUsuario.
Obs.: Se eu colocar sistema.setUsuarios(getPerfilUsuarios());
ele grava e no banco ele grava a referência de todos os ids dos usuários.
Desculpa se ficou extenso mais quiz tentar deixar claro.