Enum retorna null qdo usado em relacionamento
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
classe Person
e para carregar o enum estava fazendo dentro MB
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
Então pesquisando achei para criar um enum converter generico, mas não resolveu
Classe Enum Converter
Fico no aguardo
Att
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
Curtidas 0
Respostas
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
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
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,
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
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
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
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
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
se eu coloco o enum direto na classe funcionario ele funciona
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
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
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
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
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
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
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
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
21/08/2012
adicionei o converter no input e listou os country
mas qdo eu selecionou ocorre o erro abaixo
Pelo que eu estou percebendo agora o erro esta no meu método getAsObject
segue meu converter..... se puder me ajudar
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
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
confere no seu converter (debuga) se com o que vc passa no itemValue="#" dá para recurar seu enum.
att Davi
GOSTEI 0
Thiago Volpato
21/08/2012
não estou conseguindo recuperar ao selecionar o pais
ele me retorna null
ele me retorna null
GOSTEI 0
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
att Davi
GOSTEI 0
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á
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
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
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á
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
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
Se tiver tempo faz um teste transformando em uma tabela para ver se o problema persiste.
att Davi
GOSTEI 0