Dúvida sobre persistencia JPA

Java

15/12/2011

Estou fazendo o curso de JPA com as videos aulas de Dyego(Desenvolvendo uma aplicação completa com JPA) e me deparei com o seguinte problema que por sinal ja consegui soluciona-lo. Gostaria apenas de uma explicação que eu não entendi.
Tenho a classe Product e a classe Sell!
O relacionamento da classe Product com a classe Sell está da seguinte forma:

@OneToMany(mappedBy=product,cascade= CascadeType.ALL,fetch= FetchType.LAZY)
private List<Sell> sellsOfProduct = new LinkedList<Sell>();

Então decidi criar um método a mais na classe ProductDAO que Dyego nao mencionou na sua aula, foi apenas por experiência.

public List<Sell> getSellsOfProduct(Product prod){
List<Sell> sell = null;
EntityManager em = JPAUtil.getInstance().getEntityManager();
prod = em.find(Product.class, prod.getId());
sell = prod.getSellsOfProduct();
em.close();
return sell;
}

Decidi criar esse método para carregar as vendas do produto apenas quando eu precisar, pela questão de performance da aplicação com o banco de dados.

Se eu adicionar a linha em.getTransaction.commit(); acima da linha em.close();

ACONTECE O SEGUINTE ERRO:

Exception in thread main org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.completejpa.entity.Product.sellsOfProduct, no session or session was closed

Se eu tirar essa linha carrega normal as vendas do Produto.

Gostaria de saber o porque disso.
Felipe Ramalho

Felipe Ramalho

Curtidas 0

Respostas

Felipe Ramalho

Felipe Ramalho

15/12/2011

Estou fazendo o curso de JPA com as videos aulas de Dyego(Desenvolvendo uma aplicação completa com JPA) e me deparei com o seguinte problema que por sinal ja consegui soluciona-lo. Gostaria apenas de uma explicação que eu não entendi.
Tenho a classe Product e a classe Sell!
O relacionamento da classe Product com a classe Sell está da seguinte forma:

@OneToMany(mappedBy=product,cascade= CascadeType.ALL,fetch= FetchType.LAZY)
private List<Sell> sellsOfProduct = new LinkedList<Sell>();

Então decidi criar um método a mais na classe ProductDAO que Dyego nao mencionou na sua aula, foi apenas por experiência.

public List<Sell> getSellsOfProduct(Product prod){
List<Sell> sell = null;
EntityManager em = JPAUtil.getInstance().getEntityManager();
prod = em.find(Product.class, prod.getId());
sell = prod.getSellsOfProduct();
em.close();
return sell;
}

Decidi criar esse método para carregar as vendas do produto apenas quando eu precisar, pela questão de performance da aplicação com o banco de dados.

Se eu adicionar a linha em.getTransaction.commit(); acima da linha em.close();

ACONTECE O SEGUINTE ERRO:

Exception in thread main org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.completejpa.entity.Product.sellsOfProduct, no session or session was closed

Se eu tirar essa linha carrega normal as vendas do Produto.

Gostaria de saber o porque disso.


Não precisa usar o em.getTransaction.begin(); e o em.getTransaction.commit(); quando for fazer apenas leitura no banco de dados??
GOSTEI 0
Davi Costa

Davi Costa

15/12/2011

Me tira uma dúvida o valor da litsa se usar o commit, vem preenchido mesmo ou está nulo? Desconfio que ele não está preenchendo.

att Davi
GOSTEI 0
Robson Teixeira

Robson Teixeira

15/12/2011

Opa o erro mencionado org.hibernate.LazyInitializationException esse erro ocorre quando você faz uso de um atributo mapeado e configurado com Lazy e o EntityManager do JPA está fechado ou seja fez uso do metodo close.
Quanto ao uso dos metodos begin e o commit você está correto pois esses metodos são mais usados quando vai ser executado comandos dml no banco ou seja insert,update e delete.

att
robson
GOSTEI 0
Felipe Ramalho

Felipe Ramalho

15/12/2011

Me tira uma dúvida o valor da litsa se usar o commit, vem preenchido mesmo ou está nulo? Desconfio que ele não está preenchendo.

att Davi


Davi é isso.. quando eu uso o commit ele lança essa exceção.
Quando eu tiro o commit ele carrega a lista normalmente.
Só queria saber o porque. Mas acho que é do jeito que o
robson disse.

vlw
GOSTEI 0
Felipe Ramalho

Felipe Ramalho

15/12/2011

Opa o erro mencionado org.hibernate.LazyInitializationException esse erro ocorre quando você faz uso de um atributo mapeado e configurado com Lazy e o EntityManager do JPA está fechado ou seja fez uso do metodo close.
Quanto ao uso dos metodos begin e o commit você está correto pois esses metodos são mais usados quando vai ser executado comandos dml no banco ou seja insert,update e delete.

att
robson


acho que é isso mesmo robson.
Obrigado pela atenção!
qualquer dúvida eu abro outro
chamado =D
GOSTEI 0
Davi Costa

Davi Costa

15/12/2011

Show de bola! Assim que possível favor fechar o chamado.

att Davi
GOSTEI 0
Dyego Carmo

Dyego Carmo

15/12/2011

Opa !

Resolvido ? Se sim , poderia fechar o chamado ?


Valeu !
GOSTEI 0
POSTAR