SelectOneMenu Aninhado ou Cascata com EJB3, Primifaces 3.4, Jboss

10 respostas
jeferson_alves

Pessoal bom dia, tenho um combo Cliente e o outro contato, quero quando eu selecionar um cliente no outro combo sejam listados todos os contatos deste cliente.
Como fica isto no, DAO, Managed Bean e no xhtml.
Ta osso de entender isto, se alguém puder me ajudar…

10 Respostas

jeferson_alves

jeferson alves:
Pessoal bom dia, tenho um combo Cliente e o outro contato, quero quando eu selecionar um cliente no outro combo sejam listados todos os contatos deste cliente.
Como fica isto no, DAO, Managed Bean e no xhtml.
Ta osso de entender isto, se alguém puder me ajudar…

Buscar o Contato de acordo com o Cliente selecionado.
a dificuldade está mais é no DAO, como posso ligar os dois, o comando sql é tranquilo, não sei como fica no código.

G

Bom… a ideia é:
assim que selecionar um Cliente ele Atualizar o campo contato.

tenho um exemplo classico disso é o Estado e Cidade

na pagina xhtml

<h:outputText value="Estado:"></h:outputText>
										<h:column>
											<p:selectOneMenu id="comboEstado" value="#{mbViagem.estado}"
												converter="cvEstado">
												<f:selectItem itemLabel="--- Selecione ---" itemValue="0" />
												<f:selectItems value="#{mbEstado.listaEstado}" var="item"
													itemLabel="#{item.nome}" itemValue="#{item}" />
												<p:ajax update="dropCidade"
													listener="#{mbViagem.attComboCidade}"></p:ajax>
											</p:selectOneMenu>
										</h:column>
										<h:outputText value="Cidade:"></h:outputText>
										<h:column>
											<p:selectOneMenu id="dropCidade"
												disabled="#{mbViagem.comboCidade}"
												value="#{mbViagem.cidadeCombo}" converter="cvCidade">
												<f:selectItem itemLabel="--- Selecione ---" itemValue="0" />
												<f:selectItems value="#{mbViagem.listaComboCidades}"
													var="item" itemLabel="#{item.nome}" itemValue="#{item}" />
												<p:ajax
													update="comboEstado, tabelaViagemCidades,   dropCidade, hidValidaLocal"
													listener="#{mbViagem.addTabelaCidadeEditar}"></p:ajax>
											</p:selectOneMenu>
										</h:column>


									</h:panelGrid>

repare que coloquei um p:ajax dentro do selectOneMenu, pois toda vez que é selecionado é disparado a função update, contendo o id do outro combo e o metodo pra fazer isso ( attComboCidade) .

Uma coisa muito importante e bom é criar um converte… pois com isso vc pega o objeto direto.

e como o eu sempre tento manter organizado o codigo, Model fica simples fazer o metodo para att os valores…

public void attComboCidade() {
		listaComboCidades = estado.getCidades();
 	}

no model… utilizo o Hibernate para me auxiliar junto com as anotações, e com isso eu dei o meu “select” e peguei o estado e com ele todos os campos…
caso vc nao utilize o hibernate é interessante da uma olhada nele… ele vai facilitar muito a sua vida.
model. Estado.java .

@OneToMany(mappedBy = "estado", fetch = FetchType.LAZY)
	 
	private List<Cidade> cidades;

espero ter ajudado :smiley:
t+

jeferson_alves

No ajudou d+, aqui vc teria o código do DAO e do ManagedBean aí, a dificuldade maior está como eu relaciono o contato com o cliente, não estou entendendo como fica no DAO e no MB.
Vlw mesmo…

jeferson_alves

Utilizo o hibernate sim, não tinha visto a MSG toda vlw…

jeferson_alves
jeferson alves:
Utilizo o hibernate sim, não tinha visto a MSG toda vlw..
Aaaa então este código faz a ligação do meu Cliente com o contato, bacana
@OneToMany(mappedBy = "estado", fetch = FetchType.LAZY)  
       
    private List<Cidade> cidades;
G
jeferson alves:
No ajudou d+, aqui vc teria o código do DAO e do ManagedBean aí, a dificuldade maior está como eu relaciono o contato com o cliente, não estou entendendo como fica no DAO e no MB. Vlw mesmo..

Acho que voce precisa primeiro da uma lida sobre as anotações do Hibernate. Principalmente em OneToMany, OneToOne, ManyToMany.

classe Estado.java
package br.com.xxx.Model;

// Generated 20/07/2011 15:01:15 by Hibernate Tools 3.1.0.beta4

import java.util.List;
 
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Type;
 
@Entity
public class Estado {

	// Fields
	@Id
	@GeneratedValue
	private Long id;

	
	private String nome;

	
	private String sigla;

	@Type(type = "true_false")
	private boolean status;
 
	@OneToMany(mappedBy = "estado", fetch = FetchType.LAZY)
	// @Where(clause = "status='T'")
	private List<Cidade> cidades;

 //getters e setters...
}
Cidade.java
package br.com.xxxx.Model;

// Generated 20/07/2011 15:01:15 by Hibernate Tools 3.1.0.beta4

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Type;

@Entity 
public class Cidade {

	// Fields

	@Id
	@GeneratedValue
	private Long id;

	private String nome;

	@ManyToOne 
	private Estado estado;

	@Type(type = "true_false")
	private boolean status;
  
}
Meu DAO que é Generico
package br.com.xxxx.DAO;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import br.com.Decom.Util.HibernateUtil;

public class DAO<T> {

	private static Logger logger = Logger.getLogger(DAO.class);

	private Class<T> persistentClass;

	private Session session = HibernateUtil.getSession();

	public DAO(Class<T> persistentClass) {

		this.persistentClass = persistentClass;

	}
 
	@SuppressWarnings("unchecked")
	public List<T> buscaLista() {

		session.beginTransaction().begin();
		Criteria c = session.createCriteria(persistentClass);
		c.add(Restrictions.eq("status", true));
		List<T> lista = c.list();

		// session.beginTransaction().begin();
		// logger.info("ListandoTodosGenerico " + persistentClass );
		// List<T> lista = session.createCriteria(persistentClass).list();
		session.beginTransaction().commit();
		return lista;
	}

	public void salva(T t) {
		session.beginTransaction().begin();
		logger.info("SalvandoGenerico " + t);
		session.save(t);
		session.beginTransaction().commit();

	}

	public void atualiza(T t) {
		session.beginTransaction().begin();
		logger.info("AtualizandoGenerico " + t);
		session.update(t);
		session.beginTransaction().commit();
	}

	public void merge(T t) {

		logger.info("Salvando ou atualizando" + t);
		session.merge(t);
	}

	public void deleta(T t) {
		session.beginTransaction().begin();
		logger.info("DeletandoGenerico do id = " + t);
		session.update(t);
		session.beginTransaction().commit();
	}
 

}

Ok... ae ta toda a estrutura q precisa.
agora no seu ManagerBean voce precisa carregar as informações...

mbEstado
//Declara as variaveis...
        DAO<Estado> daoEstado = new DAO<Estado>(Estado.class);
	List<Estado> listaEstado = new  ArrayList<Estado>();

	//GET E SET
        public void setListaEstado(List<Estado> listaEstado) {
		this.listaEstado = listaEstado;
	}

	public List<Estado> getListaEstado() {
		attLista();//Aqui chamoo metodo para carregar a lista do Banco (nao sei se é a maneira certa de se fazer)
		return listaEstado;
	}
	public String attLista() {
		listaEstado = daoEstado.buscaLista();
		return "ok";
	}

Bom.. agora temos a lista para mostrar na Tela... ae agora
voce utiliza o codigo q ja postei em cima da pagina... .xhtml
ae no combo, coloca o ajax, contendo o id do componente que quer atualizar usando a função "update"
e a função "listener" para executar o metodo que vai atualizar as cidades.

vou posta o meu converter pq acho interessante ter. ainda nao tive tempo de trabalhar nele e deixa-lo generico. o codigo fica bem mais limpo utilizando ele.
package br.com.xxxx.Conversores;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import br.com.xxxx.DAO.DAO;
import br.com.xxxx.Model.Estado;

@FacesConverter("cvEstado")
public class cvEstado implements Converter {

	
	DAO<Estado> dao = new DAO<Estado>(Estado.class);
	
	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
		try {
			return dao.busca(arg2);
		} catch (NumberFormatException e) {
			return new Estado();
		}
	}

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

Agora mãos a obra :D

G
jeferson alves:
jeferson alves:
Utilizo o hibernate sim, não tinha visto a MSG toda vlw..
Aaaa então este código faz a ligação do meu Cliente com o contato, bacana
@OneToMany(mappedBy = "estado", fetch = FetchType.LAZY)  
       
    private List<Cidade> cidades;

isso com esse codigo e como vc estivesse dando um select no banco na tabela cidade e dando um where passando o id do estado ... tudo isso com um simples objeto.cidades :D
por isso que falo pra vc saber mais das anotações do hibernate :D

jeferson_alves

Cara Deus te abençoe, vou estudar mais sim preciso muito, agora estou entendendo, vou fazer aqui e te falo, vlw…

R

Olá galera, tudo bem? Sou novato na área e estou tentando a alguns dias salvar dados de um lugar em outro. Vou explicar...
Tenho três tabelas a princípio: Autores, Acervo, e AcervoxAutores. Tenho vários campos nas mesmas, mas em particular, tenho duas FK na tabela de AcervoxAutores (uma relacionando autores e outra acervo.
Pretendo fazer o seguinte, colocar no xhtml de ACERVO um autoComplete no qual ele pega a lista de autores que eu tenho no meu autoreslist e salve na TABELA de AcervoxAutores.
Por exemplo, se eu colocar como value acervoJsfBean.crudObj.acdd (sendo acdd um campo que possuo em acervo e que seja string) ele está salvando normal na tabela de acervo. Porém não é esse meu objetivo. Quero colocar o bean de acervoxautores.crudObj.( algum dos dois campos que eu tenho na tabela de acervoxautores para salvar lá dentro, mas n está dando certo. Além disso, o código vai ser gerado automático e o campo de acervo deveria pegar o código do acervo
Segue abaixo os códigos relacionados:

AcervoxAutores.java

@Entity
@Table(name = "BIB_ACERVOXAUTORES")

public class AcervoxAutores implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GEN_BIBACERVOXAUTORES")
    @SequenceGenerator(name = "GEN_BIBACERVOXAUTORES", sequenceName = "GEN_BIBACERVOXAUTORES", allocationSize = 1, initialValue = 1)
    @Column(name = "ACXAUT_CODIGO")
    private Integer acxautCodigo;
   
    @JoinColumn(name = "ACXAUT_CODAUTOR", referencedColumnName = "AUT_CODIGO")
    @ManyToOne
    private Autores acxautautor;
    
    @JoinColumn(name = "ACXAUT_CODACERVO", referencedColumnName = "ACE_CODIGO")
    @ManyToOne
    private Acervo acxautacervo;
    
   

    public AcervoxAutores() {
    }

    public AcervoxAutores(Integer acxautCodigo) {
        this.acxautCodigo = acxautCodigo;
    }

    public Integer getAcxautCodigo() {
        return acxautCodigo;
    }

    public void setAcxautCodigo(Integer acxautCodigo) {
        this.acxautCodigo = acxautCodigo;
    }

    public Autores getAcxautautor() {
        return acxautautor;
    }

    public void setAcxautautor(Autores acxautautor) {
        this.acxautautor = acxautautor;
    }

   
    public Acervo getAcxautacervo() {
        return acxautacervo;
    }

    public void setAcxautacervo(Acervo acxautacervo) {
        this.acxautacervo = acxautacervo;
    }

   

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (acxautCodigo != null ? acxautCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof AcervoxAutores)) {
            return false;
        }
        AcervoxAutores other = (AcervoxAutores) object;
        if ((this.acxautCodigo == null && other.acxautCodigo != null) || (this.acxautCodigo != null && !this.acxautCodigo.equals(other.acxautCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return acxautautor.toString();
    }
    
}

AcervoxAutoresService:

@Stateless
@LocalBean
public class AcervoxAutoresService {
    
     public static final String PREFIXO_OBJETO = "aa";
    private static final String QUERY_AcervoxAutores = "select aa from AcervoxAutores aa";
    private static final Logger log = LoggerFactory.getLogger(AcervoxAutoresService.class);
    @EJB
    private CrudService crudService;

    private FiltrosConsulta criaFiltros(Map<String, Object> params) {
        FiltrosConsulta filtros = new FiltrosConsulta();

        filtros.add("UPPER(aa.acxautautor.autCodigo) like :acxautautor", "acxautautor", params.get("acxautautor"), true, FiltrosConsulta.Like.Both);
        filtros.add("UPPER(aa.acxautacervo.aceCodigo) like :acxautacervo", "acxautacervo", params.get("acxautacervo"), true, FiltrosConsulta.Like.Both);

        return filtros;
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public List<AcervoxAutores> listaAcervoxAutoresRelatorio(Map<String, Object> parametros) {
        String orderBy = ServiceUtil.montaOrderBy("acxautCodigo", true, PREFIXO_OBJETO);
        return crudService.executeQuery(QUERY_AcervoxAutores, orderBy, criaFiltros(parametros));
    }
}

Acervo.java

@Entity
@Table(name = "BIB_ACERVO")
public class Acervo implements Serializable, Auditable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GEN_BIBACERVO")
    @SequenceGenerator(name = "GEN_BIBACERVO", sequenceName = "GEN_BIBACERVO", allocationSize = 1, initialValue = 1)
    @Column(name = "ACE_CODIGO")
    private Integer aceCodigo;
    @Size(max = 200)
    @Column(name = "ACE_TITULO")
    private String aceTitulo;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "acxautacervo")
     private Collection<AcervoxAutores> bibAcervoxAutoresCollection;
    
AcervoJsfBean:

@ManagedBean
@ViewScoped //@ViewScoped //@SessionScoped 
public class AcervoJsfBean extends BaseCRUDJSFBean<Acervo> {

    public static final String RELATORIO_ACERVO = "acervo";
    private static Logger log = LoggerFactory.getLogger(AcervoJsfBean.class);
    
   
    @EJB
    private AcervoService a;
    @EJB
    private TipoMaterialService m;
    @EJB
    private IdiomaService i;
    @EJB
    private EditorasService e;
    @EJB
    private AutoresService y;
    @EJB
    private ClassificacaoService c;
    @EJB
    private AcervoxAutoresService aa;
    
    private List<Acervo> acervoList = new ArrayList<Acervo>();
    private List<TipoMaterial> TipoMaterialList = new ArrayList<TipoMaterial>();
    private List<Idioma> idiomaList = new ArrayList<Idioma>();
    private List<Editoras> editorasList = new ArrayList<Editoras>();
    private List<Classificacao> classificacaoList = new ArrayList<Classificacao>();
    private List<Autores> autoresList = new ArrayList<Autores>();
    private List<AcervoxAutores> acervoxautoresList = new ArrayList<AcervoxAutores>();
    
    private String aceTitulo;
    private String aceSubtitulo;
    private String aceIsbn;
    private String aceLocalizacao;
    private String aceeditora;
    private String aceidioma;
    private String aceclass;
    private String acetipomate = "";
    private Classificacao aceClasFiltro;

    

    public List<AcervoxAutores> getAcervoxautoresList() {
        return acervoxautoresList;
    }

    public void setAcervoxautoresList(List<AcervoxAutores> acervoxautoresList) {
        this.acervoxautoresList = acervoxautoresList;
    }
    
    
    
    


    public List<Acervo> getAcervoList() {
        return acervoList;
    }

    public void setAcervoList(List<Acervo> acervoList) {
        this.acervoList = acervoList;
    }

    public List<TipoMaterial> getTipoMaterialList() {
        return TipoMaterialList;
    }

    public void setTipoMaterialList(List<TipoMaterial> TipoMaterialList) {
        this.TipoMaterialList = TipoMaterialList;
    }

    public List<Idioma> getIdiomaList() {
        return idiomaList;
    }

    public void setIdiomaList(List<Idioma> idiomaList) {
        this.idiomaList = idiomaList;
    }

    public List<Editoras> getEditorasList() {
        return editorasList;
    }

    public void setEditorasList(List<Editoras> editorasList) {
        this.editorasList = editorasList;
    }

    public List<Classificacao> getClassificacaoList() {
        return classificacaoList;
    }

    public void setClassificacaoList(List<Classificacao> classificacaoList) {
        this.classificacaoList = classificacaoList;
    }

    public Classificacao getAceClasFiltro() {
        return aceClasFiltro;
    }

    public void setAceClasFiltro(Classificacao aceClasFiltro) {
        this.aceClasFiltro = aceClasFiltro;
    }

    public List<Autores> getAutoresList() {
        return autoresList;
    }

    public void setAutoresList(List<Autores> autoresList) {
        this.autoresList = autoresList;
    }

    
    
    @Override
    protected void setup() {
        super.setup();
        this.TipoMaterialList = getCrudService().findAll(TipoMaterial.class, "tipoDescricao");
        this.idiomaList = getCrudService().findAll(Idioma.class, "idiDescricao");
        this.editorasList = getCrudService().findAll(Editoras.class, "ediDescricao");
        this.classificacaoList = getCrudService().findAll(Classificacao.class, "clasDescricao");
        this.autoresList = getCrudService().findAll(Autores.class, "autDescricao");
        this.acervoList =  getCrudService().findAll(Acervo.class, "aceCodigo");
    }

    @Override
    public void criaObjeto() {
        super.criaObjeto();
        Date data = new Date();
        crudObj.setAceDatacad(data);

//        for (int i = 0; i < 5; i++) { // tenta gravar 5 registros no banco
//            Exemplar e = new Exemplar();
//            e.setExeCodigo(8);
//
//            e.setExeacervo(crudObj); // passa um valor
//            e.setExeDatabaixa(data);
//            e.setExeVolume(9);
//            e.setExeDatacad(data);
//            e.setExeExemplar(6);
//            e.setExeLocalizacao("14F");
//            e.setExeMotivbaixa("Devolução");
//            e.setExeObs("Observação");
//            e.setExeSituacao("Baixado");
//            e.setExeVolume(4); // passa um valor
//           
//            
//            crudObj.getBibAcervoCollection().add(e); //adiciona na collection
//        }
    }

    public void geraRelatorioAcervoPDF() {
        geraRelatorioAcervo(true);
    }

    public void geraRelatorioAcervo(boolean isPDF) {
        List<Acervo> listaRelatorio = a.listaAcervoRelatorio(montaParametros());
        if (isPDF) {
            // Relatatório em PDF com folha de rosto padrão
            geraRelatorioPDF(listaRelatorio, RELATORIO_ACERVO);
        }
    }

    public AcervoJsfBean() {
    }

    @Override
    public void renovarTabela() {
        filtraAcervo();
    }

    public void filtraAcervo() {
        acervoList = a.listaAcervoRelatorio(montaParametros());
    }

    private Map<String, Object> montaParametros() {
        Map<String, Object> p = new HashMap<String, Object>();

        p.put("aceTitulo", aceTitulo);
        p.put("aceSubtitulo", aceSubtitulo);
        p.put("aceIsbn", aceIsbn);
        p.put("aceLocalizacao", aceLocalizacao);
        p.put("aceeditora", aceeditora);
        p.put("aceidioma", aceidioma);
        p.put("aceclass", aceclass);
        p.put("acetipomate", acetipomate);

        return p;
    }

    public List<Classificacao> completaClassificacao(String query) {
        this.classificacaoList = c.findClassificacaoByNome(query);
        return c.findClassificacaoByNome(query);
    }
    
      public List<Autores> completaAutores(String query) {
        this.autoresList = y.findAutoresByNome(query);
        return y.findAutoresByNome(query);
    }
      
        public List<Acervo> completaAcervo(String query) {
        this.acervoList = a.findAcervoByNome(query);
        return a.findAcervoByNome(query);
    }
    


Acervo.xhtml (nele  vou pegar a parte do autocomplete:

<p:outputLabel id="autores_lbl" value="Autores" for="acautores"/>
                                    <p:autoComplete id="acautores" completeMethod="#{acervoJsfBean.completaAutores}" required="false" multiple="false" requiredMessage="Informe o autor" forceSelection="true" minQueryLength="1" queryDelay="1"
                                                    dropdown="true"  var="y" itemLabel="#{y.autDescricao}" itemValue="#{y.autCodigo}" value="#{acervoxAutoresJsfBean.crudObj.acxautautor}">
                                        <p:ajax event="itemSelect" listener="#{acervoJsfBean.autoresList}"/>  
                                        
                                    </p:autoComplete>
OBS: se possível onde tem o value="#{acervoxAutoresJsfBean.crudObj.acxautautor}"> façam o teste com value="#{acervoJsfBean.crudObj.aceTitulo}">

Se puderem ajudar, agradeço muitoo!!

G

da uma olhada sobre o primefaces ele tem um componente, que faz a função de autocomplete da uma olhada la
la tem a demo dos componentes.

http://www.primefaces.org/showcase-labs/ui/autocompleteHome.jsf

Criado 27 de novembro de 2012
Ultima resposta 28 de nov. de 2012
Respostas 10
Participantes 3