Enum retorna null qdo usado em relacionamento

10 respostas
T

bom dia,

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

}

Alguém sabe como resolver isso

Att

Abri o tópico no forum errado, foi mal...
pode mover ele para desenvolvimento web

10 Respostas

F

Você esta tentando acessar desta forma: person.address.country? Eu acho que quem esta vindo nulll é o address,
não estaria faltando um @JoinColumn ou @PrimaryKeyJoinColumn?

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

vc diz colocar @JoinColumn(ADDRESS_ID) ?

fbl.lucas:
Você esta tentando acessar desta forma: person.address.country? Eu acho que quem esta vindo nulll é o address,
não estaria faltando um @JoinColumn ou @PrimaryKeyJoinColumn?

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

F

tmvolpato:
vc diz colocar @JoinColumn(ADDRESS_ID) ?

fbl.lucas:
Você esta tentando acessar desta forma: person.address.country? Eu acho que quem esta vindo nulll é o address,
não estaria faltando um @JoinColumn ou @PrimaryKeyJoinColumn?

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

Exatamente, no seu código ja existe esta anotação? A chave primária de Person é a mesma de Address? Se for a mesma você deve usar o @PrimaryKeyJoinColumn

T

lá na classe Address
eu tenho isso

@OneToOne @JoinColumn(PERSON_ID) private Person person:

A chave primaria não é a mesma

então na classe Person

eu faria isso

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

certo?

fbl.lucas:
tmvolpato:
vc diz colocar @JoinColumn(ADDRESS_ID) ?

fbl.lucas:
Você esta tentando acessar desta forma: person.address.country? Eu acho que quem esta vindo nulll é o address,
não estaria faltando um @JoinColumn ou @PrimaryKeyJoinColumn?

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

Exatamente, no seu código ja existe esta anotação? A chave primária de Person é a mesma de Address? Se for a mesma você deve usar o @PrimaryKeyJoinColumn

F

Tenta desta forma:
Address

@OneToOne  
@JoinColumn(name="PERSON_ID", nullable = false)  
private Person person;

Person

@OneToOne(cascade=CascadeType.ALL, mappedBy="person")  
private Address address;
T

Ainda continua retornando null

fbl.lucas:
Tenta desta forma:
Address

@OneToOne  
@JoinColumn(name="PERSON_ID", nullable = false)  
private Person person;

Person

@OneToOne(cascade=CascadeType.ALL, mappedBy="person") private Address address;

T

acho que eu vou ter que criar um converter para esse enum

Grave: Error Rendering View[/hr/employee/add-employee.xhtml] javax.el.PropertyNotFoundException: /hr/employee/add-employee.xhtml @302,24 value="#{employeeFace.selectBean.address.country.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)

mão parece ser relacionamento

F

tmvolpato:
acho que eu vou ter que criar um converter para esse enum

Grave: Error Rendering View[/hr/employee/add-employee.xhtml] javax.el.PropertyNotFoundException: /hr/employee/add-employee.xhtml @302,24 value="#{employeeFace.selectBean.address.country.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)

mão parece ser relacionamento

coloca um h:outputText ai para ver quem ta null, se é address ou country

T

Segue meu selectOneMenu

<h:outputLabel for="country" value="#{msg.label_country}: *" /> <p:selectOneMenu id="country" label="#{msg.label_country}" value="#{employeeFace.selectBean.address.country.country}" required="true"> <f:selectItem itemValue="#{null}" itemLabel="#{msg.select_initialState}" /> <f:selectItems value="#{employeeFace.countryValues}"/> <p:ajax event="change" listener="#{employeeFace.actionLoadStates}" update="cityName,state,foreignCityLabel, foreignCityInput" /> </p:selectOneMenu>

e tbm já tentei itemValue e o itemLabel

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

T

o erro continua

e não relacionamento
já comparei meu relacionamento com vários e não tem nada fora do normal

to achando que tem haver com a classe Person que recebe Address (Person é onde começa minha herança(joined))

segue o erro que continua dando

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)

Criado 21 de agosto de 2012
Ultima resposta 22 de ago. de 2012
Respostas 10
Participantes 2