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…???[/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 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 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
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.
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?