GARANTIR DESCONTO

Fórum Enum retorna null qdo usado em relacionamento #422087

21/08/2012

0

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

Responder

Posts

21/08/2012

Davi Costa

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
Responder

Gostei + 0

21/08/2012

Thiago Volpato

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
Responder

Gostei + 0

21/08/2012

Davi Costa

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
Responder

Gostei + 0

22/08/2012

Thiago Volpato

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
Responder

Gostei + 0

22/08/2012

Thiago Volpato

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
Responder

Gostei + 0

22/08/2012

Davi Costa

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
Responder

Gostei + 0

22/08/2012

Thiago Volpato

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
Responder

Gostei + 0

22/08/2012

Thiago Volpato

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();
	}
Responder

Gostei + 0

22/08/2012

Davi Costa

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
Responder

Gostei + 0

22/08/2012

Thiago Volpato

não estou conseguindo recuperar ao selecionar o pais
ele me retorna null
Responder

Gostei + 0

22/08/2012

Davi Costa

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
Responder

Gostei + 0

22/08/2012

Thiago Volpato

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á
Responder

Gostei + 0

22/08/2012

Thiago Volpato

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á
Responder

Gostei + 0

23/08/2012

Davi Costa

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar