SelectOneMenu com BD não salva

6 respostas
jhoey

Ae galera! Boa noite! :shock:
Estou com um pequeno probleminha aqui.
Eu tenho uma classe empresa e equipe, sendo que a equipe faz parte da empresa. Na hora do cadastro da equipe, devemos dizer qual empresa ela faz parte.
Para selecionar a empresa, eu fiz um SelectOneMenu, mostra as empresas no SelectItems, fiz converter, tudo bonitinho, só que não persiste a equipe, quando eu clico no botão, ele não executa nenhuma ação, agora só tirar o SelectOneMenu que o form já envia solicitação. Agora se eu tirar o SelectOneMenu do JSF, ele faz a persistência. Segue abaixo, a classe, converter e JSF. Lembrando que estou utilizando Hibernate para persistência e primefaces. Não gera nenhum log.

Classe Empresa
public class Empresa{
	@Id @GeneratedValue
	private long id;
	private String nome;
//get e set omitidos
Classe Equipe
@Entity
public class Equipe{
	@Id @GeneratedValue
	private long id;
	private Empresa empresa;
	private String nome;
	private int minArquivo;
	private int diasLimites;
	private boolean ativo = true;
	
	//get e set omitidos
}
Converter
@FacesConverter(value="EmpresaConverter", forClass=Empresa.class)
public class EmpresaConverter implements Converter {
	private EmpresaController emp = new EmpresaController();
	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		return emp.getEmpresasPorId(Integer.valueOf(value));
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		return String.valueOf(((Empresa)value).getId());
	}
	
}
JSF
<p:fieldset legend="Adicionar Equipe">
			<h:form>
				<h:panelGrid columns="2">
					<h:outputText value="Nome:" />
					<p:inputText value="#{equipeController.equipe.nome}" />
					<h:outputText value="Empresa: " />
					<h:selectOneMenu id="Empresa" value="#{equipeController.equipe.empresa}">
						<f:selectItems value="#{empresaController.empresas}" var="emp" itemLabel="#{emp.nome}" itemValue="#{emp}" />
						<f:converter converterId="EmpresaConverter" />
					</h:selectOneMenu>
					<h:outputText value="Minimo de Arquivos: " />
					<p:spinner min="0" value="#{equipeController.equipe.minArquivo}"/>
					<h:outputText value="Qtd dias limite: " />
					<p:spinner min="0" value="#{equipeController.equipe.diasLimites}" />
					
					<p:commandButton actionListener="#{equipeController.salvar}" value="Cadastrar"/>
					<p:commandButton type="reset" value="Limpar"/>
				</h:panelGrid>
			</h:form>
		</p:fieldset>

6 Respostas

mausexdd

Amigo bom dia , eu vi que tu fes um converter , sinceramente nunca fiz deste jeito , do modo que eu aprendi e faço
não sei se pe certo ou errado ,para falar a verdade nem sabia que dava para criar uma classe para pegar o valor (com esse tal de converter xD) selecionado

mas tu pode fazer da seguinte maneira , acredito que não seja POG , la no seu Bean voce criar uma variavel idEmpresa. e gerar get e setters e passar o valor do que voce selecionar para essa variavel .

<h:selectOneMenu id="Empresa" value="#{equipeController.equipe.empresa}"> <f:selectItems value="#{empresaController.empresas}" var="emp" itemLabel="#{emp.nome}" itemValue="#{equipeController.idEmpresa}" /> <f:converter converterId="EmpresaConverter" /> </h:selectOneMenu>

jhoey

@mausexdd
Na verdade, acho que isso pra mim é desnecessário, porque se for ver o código HTML que está sendo gerado do SelectOneMenu, é extremamente funcional.

<select id="Empresa" name="Empresa" size="1"> <option value="1">teste1</option> <option value="3">Teste 5</option> </select>

Mas mesmo assim, quando clico no botão não gera nada, nem erro, nem nada no log do GlassFish. É como se o botão estivesse sem ação.

jhoey

Troquei o botão do primeface < p:commandButton / > para < h:commandButton / >, agora está dando erro de validação!

j_idt27:Empresa: Erro de validação: o valor não é válidoj_idt27:Empresa: Erro de validação: o valor não é válido

Mas o código-fonte gerado do xhtml da parte do select é:

<select id="Empresa" name="Empresa" size="1">
<option value="1">teste1</option>
<option value="3">Teste 5</option>
</select>

Sendo que é o converter que faz essa conversão do value, quando executa o getAsObject, ele faz uma consulta no banco, para pegar o objeto correto.

jhoey

Consegui fazer funcionar, era só implementar o hashcode e o equals no model empresa.
Ele esta gravando o objeto serializado no campo, só que deveria só gravar o id, já que tem relacionamento de muitas equipes para uma empresa.
Só persiste a equipe, quando eu tiro o relacionamento, agora quando eu coloco o relacionamento ele não persiste.
O que posso fazer?

E

Amigo conseguiu resolver, se sim post a solução por favor…estou precisando…abraçuuu

jhoey

Caro eduardimaa,

Eu não lembro da solução, assim que eu chegar em casa, eu vejo que eu fiz, e te dou um toque.

Abraço,

Jonas

Criado 5 de setembro de 2011
Ultima resposta 12 de jul. de 2012
Respostas 6
Participantes 3