Popular combo com JPA relacionamento LAZY

8 respostas
furacao123

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

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

    }
dessa maneira estando em EAGER ou LAZY funciona perfeitamente, agora se eu inverto
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);

    }

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?

8 Respostas

lelodois

Porque vc não inicializa os dados do combo?

furacao123

Não entendi…???

lelodois

Não entendi…???

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

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?

furacao123

Infelizmente nao funcionou… :?

ja nao sei mais como resolver

lelodois

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?


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:

lelodois

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…

furacao123

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?

Criado 25 de agosto de 2010
Ultima resposta 25 de ago. de 2010
Respostas 8
Participantes 2