Objeto recupera, mas mostra nulo

Olá pessoal, estou des3envolvendo web, jsf com hibernate e spring, capturo o objeto de uma table vindo de uma lista:

public void getOcorrencia(Cidade cidade) {

		this.inicializarOcorrencia();

		ocorrenciasTrecho = new ArrayList<Ocorrencia>();

		cidadeOcorrencia = cidade;

		if (ocorrencias.containsKey(cidade.getId())) {
			ocorrenciasTrecho = ocorrencias.get(cidade.getId());
			
		}

		
	}

o objeto cidade vem com todos os atributos nulos, ms o handler dele vem todo preenchido, alguém sabe pq?? e mesmo eu dando um getById, q recupero pelo id, continua assim, mas ele não está nulo, mas não consigo usar suas propriedades…

podem me ajudar?

Seu objeto está carregado de maneira preguiçosa :slight_smile:

Ele está lazy.

Objetos carregados de maneiras Lazy funcionam de maneira diferente, ele só recupera um atributo do banco no momento em que esse atributo for utilizado.

caso ocorra um caso em que você tente acessar o atributo sem uma conexão aberta, será lançada uma LazyInitializationException.

Veja aqui um post sobre isso: Quatro soluções para LazyInitializationException

eu sei, mas quando eu dou um cidade = facade.getCidadeById(cidade.getId());

ele recupera objeto individualmente… então ele teria que ser recuperado.

[quote=winigma]eu sei, mas quando eu dou um cidade = facade.getCidadeById(cidade.getId());

ele recupera objeto individualmente… então ele teria que ser recuperado.[/quote]

Esse seu “teria” depende de muitos fatores… Eu digo que ele “poderia” ser completamente carregado.
isso vai depender do seu mapeamento e/ou da implementação do seu método.

meu metodo getById:

public Cidade getById(Serializable arg) {
		HQLQuery<Cidade> hql = new HQLQuery<Cidade>(entityManager);
		hql.append("from Cidade c");
		hql.appendEqual("c.id", arg);

		Cidade cidade = hql.getSingleResult();
		

		return cidade;
	}

viu???

Referente ao artigo, não dar erro, não há exception… só fica no handler mesmo… atributos nulos

[quote=winigma]Referente ao artigo, não dar erro, não há exception… só fica no handler mesmo… atributos nulos[/quote]Mesmo que não dê o erro, o conceito prevalece. Objeto lazy não carrega desse modo.

Só será lançada uma exceção se você tentar navegar para o atributo sem uma conexão aberta, foi isso que eu disse.

E sua query também não quer dizer nada, é necessário ver o mapeamento da entidade.

Mapeamento:


@Entity
@Table(name = "cidade")
public class Cidade implements Identificavel<Long> {

	
	private static final long serialVersionUID = 7177216598858973008L;

	@Id
	@SequenceGenerator( name = "gen", sequenceName = "cidade_id_seq" )
	@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "gen" )
	@Column(name = "ID")
	private Long id;

	@NotNull(message="notnull")
	@Label("lblCidade")
	@Column(name = "NOME", length = 255 )
	private String nome;
	
	@NotNull(message="notnull")
	@Label("lblSigla")
	@Column(name = "SIGLA", length = 3 )
	private String sigla;

	@NotNull(message="notnull")
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "ID_ESTADO")
	@Label("lblEstado")
	private Estado estado;

	@ManyToOne(fetch = FetchType.LAZY)
	@NotNull(message="notnull")
	@JoinColumn(name = "ID_PAIS")
	@Label("lblPais")
	private Pais pais;
	
	
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cidade")
	private List<FollowUpImportTrecho> trechos;



}

Ocultei os gets e sets

Então???

@Hebert, mas vc ta vendo que eu capturo o id, faço a droga do getById, e mesmo assim ele não carrega?

eu isolo o objeto cidade em um novo, e mesmo assim ele não carrega.

[code]

@Entity
@Table( name = “FOLLOW_UP_IMPORT_TRECHO” )
public class FollowUpImportTrecho implements Identificavel {

/** */
private static final long serialVersionUID = 1470741965131500466L;

@Id
@SequenceGenerator( name = "gen", sequenceName = "follow_up_imp_trecho_id_seq" )
@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "gen" )
private Long id;

@Temporal(TemporalType.DATE)
@NotNull(message="notnull")
@Label( "lblDtPlanejado" )
@Column( name = "DT_PLANEJADO", nullable = false )
private Date dtPlanejado;




@JoinColumn( name = "ID_CIDADE" )
@ManyToOne( fetch = FetchType.EAGER )
@Label( "lblFollowUp" )
@Fetch(FetchMode.JOIN)
private Cidade cidade;

}[/code]

essa a outra parte da outra entidade que se liga a cidade, puts que problema chato nem passando o id manualmente e fazendo o metodo, o objeto carrega,…

Cidade que está vindo com os atributos null?

eu nunca vi esse HQLQuery, então não sei como ele funciona.

hqlQuery é hql componentizado… releve isso, ele um select normal e um where pelo id

como eu disse cidade vem com os ATRIBUTOS NULOS, mas o handler vem preenchido… com os valores dos atributos

Isso é a definição do Lazy.

Agora se fosse JPA, os atributos que não estão relacionados com anotações *ToMany ou marcados explicitamente como lazy, deveriam vir carregados, como o nome, a sigla e o estado.

não sei mais ql o problema… mesmo se eu pegar cidade isoladamente no método e passar na marretada por exemplo id, ele não carrega, continua vindo nulos, agora no editar cidade uma outra tela ele carrega,… mesmo método getById…

Nada pessolal???

ja tentou trocar de

@ManyToOne(fetch = FetchType.LAZY)

para

@ManyToOne(fetch = FetchType.EAGER)

???