Re:O relacionamento não está carregando mesmo com EAGER. (RESOLVIDO)

Pessoal, tenho duas entidades relacionadas em MUITOS para UM.
A entidade Divida deve conter UM Cliente.
Gostaria que sempre que uma entidade DIVIDA fosse carregada seu Cliente também o fosse.
Mesmo paracendo que o relacionamento está tudo bem, que os dados existem no banco e que até mudei o Fetch para EAGER.
NÃO FUNCIONA !!!

Quando peço para entidade ser carregada pelo Criteria do hibernate, ela é carregada apenas com a chave primaria.

	Criteria cri = gethSession().createCriteria(Divida.class).add(Restrictions.eq("id",dividaId));			 
	Divida divida  = (Divida) cri.uniqueResult();

Este trecho gera o seguinte SQL:

select
     ...[Campos da tabela divida]
     ...[Campos da tabela Cliente]
    from
        Divida this_ 
    left outer join
        Cliente cliente2_ 
            on this_.cliente_id=cliente2_.id 
    where
        this_.id= ?

Minhas entidades estão configuradas como abaixo:

@Entity
@Name("divida")
public class Divida implements Serializable {

	@ManyToOne(fetch = FetchType.EAGER)
	@ForeignKey(name = "FK_DIVIDA_CLIENTE")
	@Index(name = "IDX_DIVIDA_CLIENTE_ID")
	private Cliente cliente;

       ...[outros campos]
}
@Entity
public class Cliente implements Serializable {
	
        @OneToMany(mappedBy = "cliente")
	private List<Divida> dividas = new ArrayList<Divida>();
       
        ...[outros campos]
}

Este é meu problemão… Alguém pode me ajudar ??? Abraços :frowning:

O que acontece? Vem null?

OBS.: Edita tudo aí e troca de EAGLE para EAGER. (Eagle é águia! =p)

Coloca o (fetch = FetchType.EAGER) no cliente, e não na dívida.

[quote=jakefrog]O que acontece? Vem null?

OBS.: Edita tudo aí e troca de EAGLE para EAGER. (Eagle é águia! =p)[/quote]

rsrsrs… Verdade… Valeu jakefrog :smiley:

Respondendo a pergunta… Os campos da entidade Divida vem NULL, exceto o de chave primaria.

coloca a classe toda aí uai!

oddy.silva,
infelizmente não funcionou. abs

Cara como o sistema não é meu,
não posso colocar coisas que remetam as regras de negócio. :frowning:
Pode me prejudicar, porém posso afirmar que são outros campos comuns ou que possuam tb relacionamento com outras entidades.
Espero que me entenda.

Vc acha que pode ser algo relacionada a session ?

Estou usando JBoss Seam 2, e o managedBean que acessa esta classe possui escopo Conversation.

Valeu pela ajuda :slight_smile:

Acho que pode ser algo relacionado ao mapeamento da sua classe. Não acho que tenha algo relacionado com o JBoss seam pois a pesquisa é feita no DB e está retornando o valor de modo errado né? Nem chegou no JBSeam ainda.

Como já rola o desespero… Vou pegar meu livro de hibernate que tenho e ver se tem outras formas de mapear cada relacionamento…
Estranho todos os campos estarem nulo, se eu pegar o select do hibernet o resultado vem na boa.

Ohhh vida !!! rsrs

Blz.

Nesse post aqui eu mostro um exemplo de @ManyToOne talvez te ajude: @OneToMany e @ManyToOne Unidirecional e Bidirecional.

[quote=jakefrog]Blz.

Nesse post aqui eu mostro um exemplo de @ManyToOne talvez te ajude: @OneToMany e @ManyToOne Unidirecional e Bidirecional.[/quote]

Fala meu camarada, tu acredita que o problema só acontece na base de homologação !!!
hahaha… Sabendo disso fui verificar os relacionamentos e comparar os dois bancos até agora não achei diferenças
estruturais na tabelas… Resta continuar fuçando… Menos mau… Pq estava muito estranho unica entidade que não carregava
com criteria…

Valeu pela ajuda. Li seu post tá bem legal. Abs

Pessoal, seguinte…

Gostaria até retificar o que foi falado nos tópicos acima por mim.

O fato relevante é que na verdade a coleção Dividas trazia algumas entidades persistentes e outras apenas
com sua representação PROXY. Infelizmente eu não tinha conhecimento sobre isso.
O proxy é uma maneira do hibernate representar a entidade apenas com sua chave primaria sem precisar
fazer um select no banco.

Consegui achar duas soluções para o problema:

1-Marcar a entidade Divida com a anotation @Proxy(lazy=false) -> (Apelação total, solução temporaria. Custo alto de memória e pouco escalonamento)

2-Utilizar o método estático: Hibernate.initialize(divida.getCliente())
Este método faz com que o relacionamento seja carregado, mesmo que esteja marcado com fetch=Lazy no atributo da entidade Divida.

Enfim, voltou a funcionar. Quem tiver outras soluções por favor enriquecer este tópicos para futuras consultas.

Abraços.