Problema complicado com JSF e EJB3

3 respostas
M

Fala pessoal!

Ca estou eu denovo. Eu estava com um problema. Resolvi, so que da maneira errada :lol:

Eu tenho uma pagina JSF com um combo selectOneMenu. Quando dou submit, eu gostaria de recuperar o OBJETO referente ao item do combo, e nao o valor String do mesmo.

Isso porque eu tenho uma classe de persistencia EJB3 e la, mapeei esse objeto com a anotação @OneToOne.

O que eu gostaria que acontecesse:
Ao dar o submit, o JSF setasse o Objeto na minha classe de persistencia e o EJB3 visse pelo @OneToOne que é pra persistir a chave estrangeira desse objeto.

O que fiz pra resolveR:
Criei o campo de chave estrangeira manualmente na classe de persistencia com tipo Integer com os getters e setters e removi o atributo da classe que era pra ser setado pelo @OneToOn

Ja tentei usar um Converter.. Nao da certo pois ele retorna um erro:
Validation Error: Value is not valid

Trecho da classe de persistencia (antes de mudar de Coordenacoes para fkcoordenacao):
@OneToOne
	@JoinColumn(name="fkregional")
	public Regionais getRegional() {
		return regional;
	}
	public void setRegional(Regionais regional) {
		this.regional = regional;
	}

Trecho do form JSF:

[code]
<h:outputText value="Regional: "/>
<h:selectOneMenu id="regional" value="#{CriarEfetivosJSFBean.efetivo.regional}"> // Regional é do tipo Regionais
<f:selectItems value="#{CriarEfetivosJSFBean.listaRegionaisView}"/>
</h:selectOneMenu>

Alguem pode ajudar?

Abs

3 Respostas

M

RESOLVI!!!

tive que sobrescrever equals e o hashcode na classe de persistencia!

Porem o equals certo nao funcionou aqui comigo. Tive que fazer o equals apenas com a linha “return true” senao nao passa…

ficou assim:

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((pkregional == null) ? 0 : pkregional.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		return true;

	}

Se alguem souber resolver da forma correta (com o equals funcionando direito) me da um toque por favor!

abraço

faelcavalcanti

e como estava antes a implementação do método equals com a verificação do atributo, acredito que pkregional ?

M

Opa tudo bem?
Vou mostrar a classe converter e o metodo equals “normal” abaixo. Eu imagino que haja algo errado no Converter mas nao consegui deduzir outra forma de escrever essa classe.

Eu imagino isso porque se eu dentro do equals peço um “obj.getClass()” para debugar, ele me traz um java.lang.Integer e imagino que deveria trazer o objeto Regional :?:

O equals:

public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Regionais other = (Regionais) obj;
		if (pkregional == null) {
			if (other.pkregional != null)
				return false;
		} else if (!pkregional.equals(other.pkregional))
			return false;
		return true;
	}

A classe Converter:

package utils.converters;

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

import base.entityBeans.Regionais;

public class RegionalConverter implements Converter{

	public Object getAsObject(FacesContext context, UIComponent component, String value){
	    
		if (value.equals(null))return null;

	    Regionais regional = new Regionais();
	    
	    Integer pk = new Integer(value);
	    
	    regional.setPkregional(pk);
	    
	    return regional;
	}

	public String getAsString(FacesContext context, UIComponent component, Object obj) {
		
		return obj.toString();
	}
}
Criado 14 de março de 2009
Ultima resposta 15 de mar. de 2009
Respostas 3
Participantes 2