Enum retorna null qdo usado em relacionamento

Java

21/08/2012

Boa tarde


estava usando enum e não estava tendo problema algum até que
precisei fazer um relacionameto @OneToOne por exemplo e agora meu enum está retornando null


Classe address

    @OneToOne(mappedBy="address")  
        @JoinColumn(name="PERSON_ID")  
        private Person person;  
          
        @Enumerated(EnumType.STRING)  
        @Column(name="Country")  
        private Country country;  



classe Person


    @OneToOne(cascade={CascadeType.ALL}, fetch=FetchType.LAZY, orphanRemoval=true)  
        private Address address;  




e para carregar o enum estava fazendo dentro MB


    public Country[] getCountryValues() {  
            return Country.values();  
        }  




Como eu disse esta funcionando, mas ao precisar usar um enum em uma classe que está fazendo relacionamento
ele me retorna null


Segue abaixo o erro


    Target Unreachable, null returned null  
        at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)  
        at org.primefaces.renderkit.InputRenderer.findImplicitConverter(InputRenderer.java:170)  
        at org.primefaces.renderkit.InputRenderer.getOptionAsString(InputRenderer.java:156)  



Então pesquisando achei para criar um enum converter generico, mas não resolveu

Classe Enum Converter


    public class EnumConverter implements Converter{  
      
        @SuppressWarnings({ "rawtypes", "unchecked" })  
        @Override  
        public Object getAsObject(FacesContext context, UIComponent component,String value) {  
            Class enumType = component.getValueExpression("value").getType(context.getELContext());  
            return Enum.valueOf(enumType, value);  
        }  
      
        @Override  
        public String getAsString(FacesContext context, UIComponent component, Object object) {  
            if (object == null){  
                return null;  
            }  
            Enum<?> type = (Enum<?>) object;  
            return type.toString();  
        }  
      
    }  


Fico no aguardo

Att
Thiago Volpato

Thiago Volpato

Curtidas 0

Respostas

Davi Costa

Davi Costa

21/08/2012

Está parecendo mais que quando vc pega o taributo do relacionamento não traz, e não o enum.
Por exemplo vc trouxe do banco Address, quando dá um getPerson().getCountry() é mais provável Person está null, verifica isso.
Se for o caso tem algumas opções, troca o LAZY por EAGER (na maioria dos casos não é muito indicado pois vai piorar sua consulta), mas se de repente na sua app, vc sempre vai precisa da Person do Address, então não terá tanto problema, senão,faz a consulta do seu Person sempre que for precisar dele, que é o que LAZY deveria fazer, mas se vc não estiver num método transacional ele não faz. A nível de performance dá exatamente no mesmo

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

21/08/2012

Já tentei fazer essa mudança e nada LAZY PARA EAGER

Parece que tem haver o relacionamento
está faltando isso na classe Person

@OneToOne(cascade={CascadeType.ALL}, fetch=FetchType.LAZY, orphanRemoval=true)
@JoinColumn(ADDRESS_ID)
private Address address;

não testei ainda,




Está parecendo mais que quando vc pega o taributo do relacionamento não traz, e não o enum.
Por exemplo vc trouxe do banco Address, quando dá um getPerson().getCountry() é mais provável Person está null, verifica isso.
Se for o caso tem algumas opções, troca o LAZY por EAGER (na maioria dos casos não é muito indicado pois vai piorar sua consulta), mas se de repente na sua app, vc sempre vai precisa da Person do Address, então não terá tanto problema, senão,faz a consulta do seu Person sempre que for precisar dele, que é o que LAZY deveria fazer, mas se vc não estiver num método transacional ele não faz. A nível de performance dá exatamente no mesmo

att Davi
GOSTEI 0
Davi Costa

Davi Costa

21/08/2012

Dá uma olhada na documentação p te ajudar:

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

e nesse exemplo tb muito bom:
http://www.mkyong.com/hibernate/hibernate-one-to-one-relationship-example-annotation/

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

21/08/2012

não é relacionamento

a minha classe Person é onde começa minha herança (Joined) será que pode ser isso

continua o erro

javax.el.PropertyNotFoundException: /hr/employee/add-employee.xhtml @301,75 value="#{employeeFace.selectBean.address.country}": Target Unreachable, 'null' returned null
	at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
	at org.primefaces.renderkit.InputRenderer.findImplicitConverter(InputRenderer.java:170)
	at org.primefaces.renderkit.InputRenderer.getOptionAsString(InputRenderer.java:156)



se eu coloco o enum direto na classe funcionario ele funciona



Dá uma olhada na documentação p te ajudar:

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

e nesse exemplo tb muito bom:
http://www.mkyong.com/hibernate/hibernate-one-to-one-relationship-example-annotation/

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

21/08/2012

vou precisar de converter para esse enum

se tiver alguns exemplos de enum converter
já testei alguns mas tbm não resolveu

se alguém souber, fico no aguardo

Att
GOSTEI 0
Davi Costa

Davi Costa

21/08/2012

Posta como vc está usando na sua página,é um select itens, ainda acha que por algum motivo no seu bean está vindo atributo nulo, de repente não é nem o JPA mesmo. Pense nisso debugue o bean em todos os cantos possíveis inclusive nos getters e setters (q vai entrar lá várias vezes) para saber pq o atributo está vazio.
O erro está claro que é nullpointer

Só para complementar erro de converter dá erro de registro inválido na tela, acontece isso para vc?

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

21/08/2012

Segue como está na página

<p:selectOneMenu id="country" label="#{msg.label_country}" value="#{employeeFace.selectBean.address.country}" required="true">
	<f:selectItem itemValue="#" itemLabel="#{msg.select_initialState}" />
	  <f:selectItems value="#{employeeFace.countryValues}" var="co" itemValue="#" itemLabel="#{co.country}" />
	     </p:selectOneMenu>





Posta como vc está usando na sua página,é um select itens, ainda acha que por algum motivo no seu bean está vindo atributo nulo, de repente não é nem o JPA mesmo. Pense nisso debugue o bean em todos os cantos possíveis inclusive nos getters e setters (q vai entrar lá várias vezes) para saber pq o atributo está vazio.
O erro está claro que é nullpointer

Só para complementar erro de converter dá erro de registro inválido na tela, acontece isso para vc?

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

21/08/2012

adicionei o converter no input e listou os country
mas qdo eu selecionou ocorre o erro abaixo

javax.el.PropertyNotFoundException: /hr/employee/add-employee.xhtml @301,108 value="#{employeeFace.selectBean.address.country}": Target Unreachable, 'null' returned null
	at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
	at br.com.erp.util.converter.GenericEnumConverter.getAsObject(GenericEnumConverter.java:14)
	at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:171)



Pelo que eu estou percebendo agora o erro esta no meu método getAsObject

segue meu converter..... se puder me ajudar

@SuppressWarnings({ "rawtypes", "unchecked" })
	@Override
	public Object getAsObject(FacesContext context, UIComponent component,String value) {
  	     Class enumType = component.getValueExpression("value").getType(context.getELContext());
	     return Enum.valueOf(enumType, value);
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object object) {
	     if (object == null){
	     return null;
	    }
	Enum<?> type = (Enum<?>) object;
	return type.toString();
	}
GOSTEI 0
Davi Costa

Davi Costa

21/08/2012

O que chega no converter provavelmente é o value,
confere no seu converter (debuga) se com o que vc passa no itemValue="#" dá para recurar seu enum.

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

21/08/2012

não estou conseguindo recuperar ao selecionar o pais
ele me retorna null
GOSTEI 0
Davi Costa

Davi Costa

21/08/2012

Oq coloca no itemValue, é o que chega na sua Classe converter, derepente seria melhor passar um outro atributo para retornar seu Enum. Ou qdo vc debuga com o que vc passa vc consegue transformar em enum?

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

21/08/2012

nada mudou..

procurei no google e nada,
o problema do enum estar vindo null pode ser o uso da herança?
pq revisando o código não tenho ideia do que pode ser.

o enum esta na classe Address que faz relacionamento com a classe Person onde começa minha herança
e na classe employee eu estendo Person..


valeu e obrigado desde de já
GOSTEI 0
Thiago Volpato

Thiago Volpato

21/08/2012

fiz alguns testes e tbm não é isso

ta foda...

Sempre usei Enum dentro da classe que vai usar

assim é a primeira vez..e não vai


nada mudou..

procurei no google e nada,
o problema do enum estar vindo null pode ser o uso da herança?
pq revisando o código não tenho ideia do que pode ser.

o enum esta na classe Address que faz relacionamento com a classe Person onde começa minha herança
e na classe employee eu estendo Person..


valeu e obrigado desde de já
GOSTEI 0
Davi Costa

Davi Costa

21/08/2012

Vc atualizou o enum, quando já existiam registros no banco? Uma vez já passei por isso.
Se tiver tempo faz um teste transformando em uma tabela para ver se o problema persiste.

att Davi
GOSTEI 0
POSTAR