Fórum Enum retorna null qdo usado em relacionamento #422087
21/08/2012
0
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
Curtir tópico
+ 0Posts
21/08/2012
Davi Costa
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
21/08/2012
Thiago Volpato
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,
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
21/08/2012
Davi Costa
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
22/08/2012
Thiago Volpato
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
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
22/08/2012
Thiago Volpato
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
22/08/2012
Davi Costa
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
22/08/2012
Thiago Volpato
<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>
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
22/08/2012
Thiago Volpato
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
22/08/2012
Davi Costa
confere no seu converter (debuga) se com o que vc passa no itemValue="#" dá para recurar seu enum.
att Davi
Gostei + 0
22/08/2012
Thiago Volpato
ele me retorna null
Gostei + 0
22/08/2012
Davi Costa
att Davi
Gostei + 0
22/08/2012
Thiago Volpato
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
22/08/2012
Thiago Volpato
ta foda...
Sempre usei Enum dentro da classe que vai usar
assim é a primeira vez..e não vai
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
23/08/2012
Davi Costa
Se tiver tempo faz um teste transformando em uma tabela para ver se o problema persiste.
att Davi
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)