Dúvida sobre persistencia JPA
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.
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
Curtidas 0
Respostas
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.
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
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
att Davi
GOSTEI 0
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
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
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
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
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
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
15/12/2011
Show de bola! Assim que possível favor fechar o chamado.
att Davi
att Davi
GOSTEI 0
Dyego Carmo
15/12/2011
Opa !
Resolvido ? Se sim , poderia fechar o chamado ?
Valeu !
Resolvido ? Se sim , poderia fechar o chamado ?
Valeu !
GOSTEI 0