Estou desenvolvendo uma aplicação de testes com JSF Facelet + JPA (hibernate) com mySQL e glassfish. O relacionamento entre as tabelas é o seguinte:
Categoria -> Produtos (OneToMany)
Produto -> Itens (OneToMany)
Endereço -> Itens (OneToMany)
Estou recebendo um erro quando o aplicativo vai carregar a página com detalhes de uma categoria selecionada, sendo que a categoria possui uma lista de produtos associados.
A mensagem é a seguinte:
exception
javax.servlet.ServletException: failed to lazily initialize a collection of role: com.pet.model.Category.productCollection, no session or session was closed
root cause
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.pet.model.Category.productCollection, no session or session was closed
A definição da bean categoria:
@Entity
@Table(name = "category")
@NamedQueries({
@NamedQuery(name = "Category.findAll", query = "SELECT c FROM Category c"),
@NamedQuery(name = "Category.findById", query = "SELECT c FROM Category c WHERE c.id = :id"),
@NamedQuery(name = "Category.findByName", query = "SELECT c FROM Category c WHERE c.name = :name"),
@NamedQuery(name = "Category.findByDescription", query = "SELECT c FROM Category c WHERE c.description = :description"),
@NamedQuery(name = "Category.findByImageurl", query = "SELECT c FROM Category c WHERE c.imageurl = :imageurl")
})
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id")
private Long id;
@Basic(optional = false)
@Column(name = "name")
private String name;
@Basic(optional = false)
@Column(name = "description")
private String description;
@Column(name = "imageurl")
private String imageurl;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "categoryId")
private Collection<Product> productCollection;
A definição da bean produto:
@Entity
@Table(name = "product")
@NamedQueries({
@NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p"),
@NamedQuery(name = "Product.findById", query = "SELECT p FROM Product p WHERE p.id = :id"),
@NamedQuery(name = "Product.findByName", query = "SELECT p FROM Product p WHERE p.name = :name"),
@NamedQuery(name = "Product.findByDescription", query = "SELECT p FROM Product p WHERE p.description = :description"),
@NamedQuery(name = "Product.findByImageurl", query = "SELECT p FROM Product p WHERE p.imageurl = :imageurl")
})
public class Product implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id")
private Long id;
@Basic(optional = false)
@Column(name = "name")
private String name;
@Basic(optional = false)
@Column(name = "description")
private String description;
@Column(name = "imageurl")
private String imageurl;
@JoinColumn(name = "category_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Category categoryId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "productId")
private Collection<Item> itemCollection;
Alguém tem idéia do que pode estar acontecendo?