ManyToOne: getId() sempre retorna NULL

8 respostas
fredaguiar

Eu tenho o seguinte mapeamento.

@ManyToOne(fetch=FetchType.LAZY, optional=false)

@ForeignKey(name=fk_usuario_empresa)

public Empresa getUsuarioEmpresa() {

return usuarioEmpresa;

}

public void setUsuEmpresa(Empresa usuarioEmpresa) {

this.usuarioEmpresa = usuarioEmpresa;

}

Bem simples, certo?
Porem, o valor da FK sempre vem NULL.

// nome esta OK
String nome = usu.getUsuarioEmpresa().getNome();

// RETORNA NULL
Integer EmpId = usu.getUsuarioEmpresa().getId();

POR QUE A FK SEMPRE VEM NULL?

8 Respostas

carlos_hen

Utiliza a annotation @JoinColumn em vez de @ForeignKey.

Abraço.

fredaguiar

Eu adicionei JoinColumn e o DESfuncionamento é o mesmo.


Se eu fizer assim nao funciona:

Usuario usu = (Usuario) session.get(Usuario.class, 1);
String nome = usu.getUsuarioEmpresa().getNome(); // OK
Integer fk = usu.getUsuarioEmpresa().getId(); //fk = NULLLLLLLLLLLLLLLLLLL


Mas assim funciona:
Empresa emp = (Empresa) session.get(Empresa.class, 1);
Integer id= usu.getUsuarioEmpresa().getId(); // OK

POR QUE???

RicardoYukito

voce gerou o banco apartir dos seus pojo ?
se gerou… depois de adicionar joincolumn voce adicionou a coluna no banco ?

seu ManyToOne ta fetch=FetchType.LAZY…
no caso que nao deu certo, voce esta inicializando esse relacionamento ? …

fredaguiar

RicardoYukito:
voce gerou o banco apartir dos seus pojo ?
se gerou… depois de adicionar joincolumn voce adicionou a coluna no banco ?

seu ManyToOne ta fetch=FetchType.LAZY…
no caso que nao deu certo, voce esta inicializando esse relacionamento ? …

Sim, inicializei no Pojo e a coluna com a chave estrangeira foi criada automaticamente no banco.
O ManyToOne e’ LAZY.
Apos inserir a empresa no usuario, eu consigo ver a FK da empresa na tabela usuario.

RicardoYukito

Voce esta fechando a sessão que buscou esse usario antes de fazer isso ? … se estiver tenta fazer isso antes de dar o Session.close

fredaguiar

nao fechei a sessao.
eu consigo recuperar qualquer atrituto, menos o getId().

Porem, eu consigo o ID se eu fizer

if (emp instanceof HibernateProxy) {

HibernateProxy hp = (HibernateProxy)emp;

empId = hp.getHibernateLazyInitializer().getIdentifier();

}

Uma baita de uma gambiarra.

RicardoYukito

Bom, as ultimas 2 coisa que sei…

relacionamento manyToOne é EAGER por padrao … se deixa eager nao vai dar mais esse problema… quase certeza.
nao perguntei… mas seu sistema é web ? … se for acho que outra pessoa pode lhe ajudar melhor… mas já vi alguns casos falando pra usar openSessionInView exatamente pra evitar erros com lazy …

att…

fredaguiar

É web sim.

vou dar uma olhada nesse openSessionInView.
Valeu.

Criado 27 de setembro de 2010
Ultima resposta 28 de set. de 2010
Respostas 8
Participantes 3