[RESOLVIDO]Picklist do Primefaces

Bom dia galera,

Então estou enfrentando alguns problemas com esse picklist. Quando eu tento gravar os usuários que estou vinculando ele estora uma exceção informando que eu não posso
converter String em Long. Isso ocorre porque estou tentando gravar uma Lista no banco onde está no banco o campo é um inteiro. Mais o que estou fazendo de errado no mapeamento do hibernate ou talvez nem seja no mapeamento, seja na propria logica.

[code]

@Entity
public class Sistema implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long idSistema;

private String nomeSistema;
private String descricao;
private String equipe;

@ManyToMany(fetch=FetchType.EAGER)
@Embedded
private List<PerfilUsuario> usuarios = new ArrayList<PerfilUsuario>();

@Valid
@ManyToOne
private PerfilUsuario vinculado;

public Long getIdSistema() {
	return idSistema;
}

public void setIdSistema(Long idSistema) {
	this.idSistema = idSistema;
}

public String getNomeSistema() {
	return nomeSistema;
}

public void setNomeSistema(String nomeSistema) {
	this.nomeSistema = nomeSistema;
}

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public String getEquipe() {
	return equipe;
}

public void setEquipe(String equipe) {
	this.equipe = equipe;
}

public static long getSerialversionuid() {
	return serialVersionUID;
}

public PerfilUsuario getVinculado() {
	return vinculado;
}

public void setVinculado(PerfilUsuario vinculado) {
	this.vinculado = vinculado;
}

public List<PerfilUsuario> getUsuarios() {
	return usuarios;
}

public void setUsuarios(List<PerfilUsuario> usuarios) {
	this.usuarios = usuarios;
}

}[/code]

[code]

@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 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;
}
	
public String remove(Sistema sistema){
	DAO<Sistema> dao = new DAO<Sistema>(Sistema.class);
	dao.remove(sistema);
	this.sistemas = dao.listaTodos();
	return "cadastroSistema?faces-redirect=true";
}

public Sistema getSistema() {
	return sistema;
}

public void setSistema(Sistema sistema) {
	this.sistema = sistema;
}

public static long getSerialversionuid() {
	return serialVersionUID;
}

public List<PerfilUsuario> getUsuariosSelecionados() {
	return usuariosSelecionados;
}

public void setUsuariosSelecionados(List<PerfilUsuario> usuariosSelecionados) {
	this.usuariosSelecionados = usuariosSelecionados;
}

public List<PerfilUsuario> getUsuarios() {
	return usuarios;
}

public void setUsuarios(List<PerfilUsuario> usuarios) {
	this.usuarios = usuarios;
}

public List<Sistema> getSistemas() {
	return sistemas;
}

public void setSistemas(List<Sistema> sistemas) {
	this.sistemas = sistemas;
}

public void setUsuarioModel(DualListModel<PerfilUsuario> usuarioModel) {
	this.usuarioModel = usuarioModel;
}

public void setPerfilUsuarios(List<PerfilUsuario> perfilUsuarios) {
	this.perfilUsuarios = perfilUsuarios;
}

}[/code]

Para facitar a leitura, quando eu coloca para gravar pegando o getPerfilUsuario ele grava só que grava os usuários existentes. E quando eu tento setar usuariosVinculados ele da a exceção de conversão.

Obs.: Metodo gravar do SistemaBean

Alguem ?

Por favor, ao postar tópicos, evite deixar TODAS AS LETRAS DO TÍTULO MAIÚSCULAS.

Então galera depois de muito quebrar a cabeça consegui resolver, bem mais simples do que parece, vamos ao codigo.

Mapeamento @ManyToMany

@Entity
@SessionScoped
public class PerfilUsuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id 
	@GeneratedValue
	private Long idUsuario;

	//Atributos

	//bi-directional many-to-many associação 
       @ManyToMany(mappedBy="usuarios", fetch= FetchType.EAGER)
        private List<Sistema> sistemas;
	

	//getters e setters
	
}
@Entity
public class Sistema implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue
	private Long idSistema;
	
	//Atributos
	
	@ManyToMany
	@JoinTable(name="sistema_perfilusuario", 
			joinColumns = {@JoinColumn(name="idSistema")}, 
			inverseJoinColumns = {@JoinColumn(name="idUsuario")})
	private List<PerfilUsuario> usuarios;
	
}

@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";
		
	}
	
	public DualListModel<PerfilUsuario> getUsuarioModel(){

		 if(this.usuarioModel==null){ 
			 this.usuarioModel = new DualListModel<PerfilUsuario>(getPerfilUsuarios(), new ArrayList<PerfilUsuario>());
		 }
		 return this.usuarioModel;
	}

}

E a mais importante a classe converter.


@FacesConverter(value = "PerfilUsuarioConverter")
public class PerfilUsuarioConverter implements Converter {

		@Override
		public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
		    Object ret = null;
		    if (arg1 instanceof PickList) {
		        Object dualList = ((PickList) arg1).getValue();
		        DualListModel dl = (DualListModel) dualList;
		        for (Object o : dl.getSource()) {
		            String id = "" + ((PerfilUsuario) o).getIdUsuario();
		            if (arg2.equals(id)) {
		                ret = o;
		                break;
		            }
		        }
		        if (ret == null)
		            for (Object o : dl.getTarget()) {
		                String id = "" + ((PerfilUsuario) o).getIdUsuario();
		                if (arg2.equals(id)) {
		                    ret = o;
		                    break;
		                }
		            }
		    }
		    return ret;
		}

		@Override
		public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
		    String str = "";
		    if (arg2 instanceof PerfilUsuario) {
		        str = "" + ((PerfilUsuario) arg2).getIdUsuario();
		    }
		    return str;
		}
}

E a pagina xhtml

	<h:outputLabel value="Vincular Usu&#225;rio(s):" for="usuario" />
					  <p:pickList iconOnly="true" id="usuario" converter="PerfilUsuarioConverter"
					  	 
					  	 addAllLabel="Adicionar todos Usu&#225;rios" 
						 addLabel="Adionar Selecionado" removeLabel="Remover Usu&#225;rio" 
						 removeAllLabel="Remover todos Usu&#225;rios"  
						 
						 value="#{sistemaBean.usuarioModel}" var="sistema" 
						 itemLabel="#{sistema.nome}" itemValue="#{sistema}">  
					  
							 <f:facet name="sourceCaption">Usu&#225;rio(s)</f:facet>  
		        			 <f:facet name="targetCaption">Vinculado(s) ao sistema</f:facet>  
        				
					  </p:pickList>

E isso ai galera desculpa se ficou um pouco grande mais e a solução do problema caso alguem precise. Obrigado a todos.

cara poderia postar o código de adicionar da tua classe DAO, ou o que tu usa para gravar
só o método de adicionar, quero comparar, pode ser?

Então, estou usando um DAO generico. Segue:

	public void adiciona(T t){
		//Consegue a entity manager
		EntityManager em = new JPAUtil().getEntityManager();
		//Abre a transacao
		em.getTransaction().begin();
		
		//persiste o objeto
		em.persist(t);
		
		//Commita a transacao
		em.getTransaction().commit();
		
		//fecha a entity manager
		em.close();
	}

havendo algum erro ou duvida posta aqui.

Nossa que estranho olha o que eu fiz:
só o método de adicionar que a classe está enorme

public void create(PalavraChave palavraChave) throws RollbackFailureException, Exception { if (palavraChave.getDocumentoList() == null) { palavraChave.setDocumentoList(new ArrayList&lt;Documento&gt;()); } EntityManager em = null; try { utx.begin(); em = getEntityManager(); List&lt;Documento&gt; attachedDocumentoList = new ArrayList&lt;Documento&gt;(); for (Documento documentoListDocumentoToAttach : palavraChave.getDocumentoList()) { documentoListDocumentoToAttach = em.getReference(documentoListDocumentoToAttach.getClass(), documentoListDocumentoToAttach.getCodigo()); attachedDocumentoList.add(documentoListDocumentoToAttach); } palavraChave.setDocumentoList(attachedDocumentoList); em.persist(palavraChave); for (Documento documentoListDocumento : palavraChave.getDocumentoList()) { documentoListDocumento.getPalavraChaveList().add(palavraChave); documentoListDocumento = em.merge(documentoListDocumento); } utx.commit(); } catch (Exception ex) { try { utx.rollback(); } catch (Exception re) { throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re); } throw ex; } finally { if (em != null) { em.close(); } } }

mas em fim funciona, valeu pela ajuda

olha só:
tenho documento e autor, eles são nxn
consigo listar e pegar os autores, mas como eu pego o documento e adiciono no banco?

[quote=jaissonduarte]olha só:
tenho documento e autor, eles são nxn
consigo listar e pegar os autores, mas como eu pego o documento e adiciono no banco? [/quote]

Olá, conseguiu resolver o problema ? Estou com um parecido:

Tenho uma tela de acervo onde gravo meus livros, nesta tela seleciono atraves do componente autocomplete multiple do primefaces (http://www.primefaces.org/showcase/ui/autoCompleteMultiple.jsf), que puxa a lista de autores, ate ai beleza, mas como eu pego essa lista de autores que eu coloquei no campo e coloco na lista, e apos isso, como eu faço para gravar na tabela acervoXautores gravando o codigo do acervo(livro) com todos os codigos dos autores do livro.

Agradeceria muito se me ajudassem. Até mais

[quote=Elvis Fabiane][quote=jaissonduarte]olha só:
tenho documento e autor, eles são nxn
consigo listar e pegar os autores, mas como eu pego o documento e adiciono no banco? [/quote]

Olá, conseguiu resolver o problema ? Estou com um parecido:

Tenho uma tela de acervo onde gravo meus livros, nesta tela seleciono atraves do componente autocomplete multiple do primefaces (http://www.primefaces.org/showcase/ui/autoCompleteMultiple.jsf), que puxa a lista de autores, ate ai beleza, mas como eu pego essa lista de autores que eu coloquei no campo e coloco na lista, e apos isso, como eu faço para gravar na tabela acervoXautores gravando o codigo do acervo(livro) com todos os codigos dos autores do livro.

Agradeceria muito se me ajudassem. Até mais[/quote]

Está com essa duvida ainda?

[quote=tmvolpato][quote=Elvis Fabiane][quote=jaissonduarte]olha só:
tenho documento e autor, eles são nxn
consigo listar e pegar os autores, mas como eu pego o documento e adiciono no banco? [/quote]

Olá, conseguiu resolver o problema ? Estou com um parecido:

Tenho uma tela de acervo onde gravo meus livros, nesta tela seleciono atraves do componente autocomplete multiple do primefaces (http://www.primefaces.org/showcase/ui/autoCompleteMultiple.jsf), que puxa a lista de autores, ate ai beleza, mas como eu pego essa lista de autores que eu coloquei no campo e coloco na lista, e apos isso, como eu faço para gravar na tabela acervoXautores gravando o codigo do acervo(livro) com todos os codigos dos autores do livro.

Agradeceria muito se me ajudassem. Até mais[/quote]

Está com essa duvida ainda?[/quote]

Nao estou, já consegui solucionar;