Popular combo com JPA relacionamento LAZY

Estou tentando fazer um combo ser populado dinamicamente com o JPA mas estou tendo problemas ao pegar o item selecionado no combobox, fiz testes e percebi que tenho o problema apenas quando o meu relacionamento esta com LAZY se estiver com EAGER funciona normalmente

[code]public testeCombo() {
initComponents();

    CategoriaController controller = new CategoriaController();
    ProdutoService prodService = new ProdutoServiceImpl();

    jComboBox1.setModel(new DefaultComboBoxModel(controller.populaCombo()));

    prod = prodService.findAll(true).get(0);

    Categoria cat = prod.getCategoria();

    jComboBox1.setSelectedItem(cat);

}[/code]

dessa maneira estando em EAGER ou LAZY funciona perfeitamente, agora se eu inverto

[code]public testeCombo() {
initComponents();

    CategoriaController controller = new CategoriaController();
    ProdutoService prodService = new ProdutoServiceImpl();

    ----> prod = prodService.findAll(true).get(0);

   -----> jComboBox1.setModel(new DefaultComboBoxModel(controller.populaCombo()));

    Categoria cat = prod.getCategoria();

    jComboBox1.setSelectedItem(cat);

}[/code]

ele cai no equals da classe mas passa o valor do other com id = null e ao depurar nao consigo ver nad ado objeto ele aparece CGLIBLazyInitializer e assim nao consigo comparar o objeto no combo e nao posso selecionar porque isso acontece?

Porque vc não inicializa os dados do combo?

Não entendi…???

Não entendi…???[/quote]

Ops… do combo não.

Porque não inicializa os dados do seu objeto antes de colocar no combo?
Por exemplo…

Categoria cat = prod.getCategoria();  
Hibernate.initialize(cat);
jComboBox1.setSelectedItem(cat);  

Abraços

mas isso nao quebra o meu encapsulamento?

pois estou trabalhando com DAO SERVICES e CONTROLLER nesse caso eu estou adicionando um comando que deveria estar no model, no handler, quando eu chamo o metodo getCategoria() o jpa nao deveria inicializar e popular o objeto categoria dentro do produto?

se eu migrar a aplicação para outro provedor por exemplo um toplink teria de substituir todo o codigo ?

nao tem isso no proprio JPA?

Outra coisa e chega de perguntas :smiley: porque invertido funciona?

Infelizmente nao funcionou… :?

ja nao sei mais como resolver

[quote=furacao123]mas isso nao quebra o meu encapsulamento?

pois estou trabalhando com DAO SERVICES e CONTROLLER nesse caso eu estou adicionando um comando que deveria estar no model, no handler, quando eu chamo o metodo getCategoria() o jpa nao deveria inicializar e popular o objeto categoria dentro do produto?

se eu migrar a aplicação para outro provedor por exemplo um toplink teria de substituir todo o codigo ?

nao tem isso no proprio JPA?

Outra coisa e chega de perguntas :smiley: porque invertido funciona?

[/quote]
No caso foi só um exemplo, vc colocaria o initialize em outro lugar (services ou dao).

O problema do proxy é que é assincrono, e não sincrono, portanto pode ser que não inicialize os dados no momento que vc quer :slight_smile:

Para evitar o hibernate.initialize

Usando criteria API dá para mudar o tipo de carregamento do relacionamento usando JPQL.
Pesquise na documentação dos FETCH JOINs.

:wink:

Olhe…
Minha humilde opinião é que eu nunca irei mudar de provider…

Então eu uso os recursos do meu provider sim.
Se estiver usando JPA 1 terá mt necessidade de utilizar algo há mais…

Particularmente se fosse arquiteto nem usaria JPA no projeto, usaria somente o meu provider de persistência favorito (hibernate).

Acredito que já discutiram sobre isso… só estou desabafando rsrsr

abraços…

Fiz o select usando o JOIN

SELECT p FROM Produto p LEFT JOIN FETCH p.categoria LEFT JOIN FETCH p.embalagem " + "WHERE p.ativo = :ativo

esse joins funciona igual o EAGER mas tem a vantagem de fazer queries especificas pra usar em determinados momentos ou nao correto?