Ajuda com selectOneMenu em Cascata JSF 2.1 + Primefaces 3.5

Bom galera, já procurei na internet bastante, tentei infinitas soluções, mas nenhuma me ajudou :frowning:

No meu projeto, eu tenho um cadastro de produtos, e cada produto pertence a um grupo e um subgrupo.

Porém eu queria deixar ao cadastrar o produto, que o usuário quando selecionar o Grupo, o selectOneMenu de SubGrupo fosse alimentado com os SubGrupos do Grupo selecionado.

Segue abaixo meus códigos:

Classe Grupo

@Entity
@Table(name = "GRUPO")
public class Grupo implements Serializable {
	@Id
	@Column(name = "ID")
	@SequenceGenerator(name = "SEQ_GRUPO", sequenceName = "GRUPO_GEN_ID", allocationSize = 1)
	@GeneratedValue(generator = "SEQ_GRUPO", strategy = GenerationType.SEQUENCE)
	private Integer idGrupo;
	@Column(name = "NOME", length = 50, nullable = false)
	@Length(max = 50, message = "O nome do Grupo deve ter no máximo 50 caracteres.")
	@NotEmpty(message = "O nome do Grupo deve ser informado!")
	private String nome;
	@OneToMany(mappedBy = "grupo", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@Valid
	private java.util.Collection<SubGrupo> subGrupo;

	public Grupo() {
	}
        // Getters and Setters, Equals and HashCode and toString

Classe SubGrupo

@Entity
@Table(name="SUBGRUPO")
public class SubGrupo implements Serializable {
	@Id
	@SequenceGenerator(name="SEQ_SUBGRUPO",sequenceName="SUBGRUPO_GEN_ID",allocationSize=1)
	@GeneratedValue(generator="SEQ_SUBGRUPO",strategy=GenerationType.SEQUENCE)
   private Integer idSubGrupo;
	@NotEmpty(message = "O nome deve ser informado!")
	@Length(max = 60, min = 3, message = "O nome deve ter entre 3 e 60 caracteres!")
	@Column(length = 60, nullable = false)
   private String nome;
	@ManyToOne(optional = false)
    @NotNull(message = "Informe o grupo!")
	private Grupo grupo;
	
	public SubGrupo() {
	}
        // Getters and Setters, Equals and HashCode and toString

ManagedBean que estou utilizando para os testes, uso neste para não ferrar o oficial do meu Produto rsrsrs

@SessionScoped
@ManagedBean(name = "pprBean")
public class PPRBean implements Serializable {

	private Grupo grupo;

	private SubGrupo subGrupo;

	private List<Grupo> grupos = new ArrayList<Grupo>();

	private Integer idGrupo;

	private List<SubGrupo> subGrupos = new ArrayList<SubGrupo>();

	public PPRBean() {

	}

	public void grupoSelecionado() {
		System.out.println("Grupos selecionado = " + grupo);
		
		if (grupo != null && !grupo.equals("")) {
			EntityManager em = GerarEntityManager.getInstance()
					.getEntityManager();
			subGrupos = em.createQuery(
					"from SubGrupo s where s.grupo_id = 2 order by nome").getResultList();
			setSubGrupos(subGrupos);
		} else {
			subGrupos = new ArrayList<SubGrupo>();
		}
	}
	//Getters and Setters

Minha página xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui">
<h:head>
	<title></title>
</h:head>
<h:body>
	<h:form id="form">

		<p:growl id="msgs" showDetail="true" />

		<p:panel header="Double Combo" style="margin-bottom:10px;">
			<h:panelGrid columns="2" cellpadding="5">
				<p:selectOneMenu id="grupo" value="#{pprBean.grupo}">
					<f:selectItem itemLabel="Selecione Grupo" itemValue="" />
					<f:selectItems value="#{pprBean.grupos}"
						itemValue="#{pprBean.grupo.idGrupo}" />
					<p:ajax update="form:subGrupos" immediate="true" event="change"
						listener="#{pprBean.grupoSelecionado}" />
				</p:selectOneMenu>

				<p:selectOneMenu id="subGrupos" value="#{pprBean.subGrupo}">
					<f:selectItem itemLabel="Selecione Subgrupo" itemValue="" />
					<f:selectItems value="#{pprBean.subGrupos}" />
				</p:selectOneMenu>
			</h:panelGrid>

		</p:panel>

	</h:form>
</h:body>
</html>

Tentei implementar como este aqui do showcase do PF: http://primefaces.org/showcase/ui/pprSelect.jsf

É neste estilo que preciso, quando selecionar o ComboBox 1, alimentasse o 2 :slight_smile:

Dentro do método grupoSelecionado, eu só recebo NULL quando mando exibir na tela. Tenho total certeza que não estou conseguindo pegar o Grupo selecionado…

Alguém pode me ajudar?

Obrigado desde já amigos!

Abraços

Bom pessoal, como ninguém respondeu, fiquei quebrando a cabeça mais um pouco até que sem querer achei o tópico do amigo Flavio Almeida:

http://www.guj.com.br/java/220692-para-voce-entityconverter-para-qualquer-entidade-e-tipo-de-id

Usando o converter da primeira página funcionou a primeira parte do problema que eu tinha, onde eu só passava null como objeto.

Então pensando mais um pouco, decidi que o melhor para mim não era usar o selectOneMenu para Grupo e SubGrupo, pois imagina o trabalho pro usuário achar um grupo se ele cadastrar uma cacetada de grupo? ahahaha

O que eu fiz? Usei o autoComplete e nele botei um p:ajax com um listener para um método SelectEvent que é chamado somente quando eu seleciono um item (event=selectItem) e então fiz umas alterações e ele tá fazendo a cascata para mim -

Caso alguém quiser, eu posso disponibilizar aqui, só tenho que ajustar pra não ficar tão chato de implementar :stuck_out_tongue: