Failed to lazily initialize a collection of role: metier.entities.Product.items, no session or session was clo
Bonjour à tous,
Je travaille sur un projet, j'ai trois 3 classes: Category, Praoduct et item qui s'associent de la manière suivante:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
@Entity
@Table(name="Category")
public class Category implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable=false, length=30)
private String name;
@Column(nullable=false)
private String description;
@OneToMany(mappedBy="category", cascade= CascadeType.REMOVE, fetch= FetchType.EAGER)
@OrderBy("name ASC")
private List<Product> products;
// getter and setter
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
@Entity
@Table(name="Product")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable=false, length=30)
private String name;
@Column(nullable=false)
private String description;
@ManyToOne(fetch= FetchType.EAGER)
@JoinColumn(name="category_fk", nullable=false)
private Category category;
@OneToMany(mappedBy="product", cascade= CascadeType.REMOVE, fetch=FetchType.LAZY)
@OrderBy("name ASC")
private List<Item> items;
//getter and setter
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
@Entity
@Table(name="Item")
public class Item implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable=false, length=30)
private String name;
@Column(name="unit_cost", nullable=false)
private Float unitCost;
@Column(name="image_path")
private String imagePath;
@ManyToOne(fetch= FetchType.EAGER)
@JoinColumn(name="product_fk", nullable=false)
private Product product; |
Une EJB Session:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
@Stateless
public class CatalogueEJB implements ICategoryLocal, ICategoryRemote {
@PersistenceContext(unitName="UP_PET")
private EntityManager em;
@Override
public List<Product> findProducts() {
Query query;
List<Product> products;
query = em.createQuery("SELECT p FROM Product p ORDER BY p.name");
products = query.getResultList();
return products;
}
@Override
public Item findItem(final Long itemId) {
if(itemId == null)
throw new ValidationException("Identifiant invalide");
Item item = em.find(Item.class, itemId);
return item;
}
@Override
public List<Item> findItems() {
Query query = em.createQuery("SELECT i FROM Item i ORDER BY i.name");
List<Item> items = query.getResultList();
return items;
} |
Un ManageBean:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
public class CatalogController {
@EJB
private ICategoryLocal catalogBean;
private String keyword;
private Category category = new Category();
private Product product = new Product();
private Item item;
private List<Product> products;
private List<Item> items;
public CatalogController() {
}
public String doFindProducts() {
final String mname = "doFindProducts";
logger.entering(cname, mname);
String navigateTo = null;
try {
category = catalogBean.findCategory(getParamId("categoryId"));
products = category.getProducts();
} catch(Exception e) {
addMessage(e);
}
return "products.displayed";
}
public String doFindItems() {
String navigateTo = null;
try {
product = catalogBean.findProduct(getParamId("productId"));
items = product.getItems();
navigateTo = "items.displayed";
}catch(Exception e) {
addMessage(e);
}
return navigateTo;
}
public String doFindItem() {
String navigateTo = null;
try {
item = catalogBean.findItem(getParamId("itemId"));
navigateTo = "item.displayed";
} catch(Exception e) {
addMessage(e);
}
return navigateTo;
}
// getter and setter
} |
Dans la partie Vue, j'utilise JSP et JSF. Lorsque je veux afficher la liste des tous les produits, cela fonctionne nikel
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<h2>Products for category :
<h:outputText value="#{catalog.category.name}"/>
</h2>
<h:form>
<h:dataTable value="#{catalog.products}" var="product">
<h:column>
<h:commandLink action="#{catalog.doFindItems}">
<h:outputText value="#{product.name}"/>
<f:param name="productId" value="#{product.id}"/>
</h:commandLink>
<br/>
<h:outputText value="#{product.description}"/>
</h:column>
</h:dataTable>
</h:form> |
Mais en cliquant sur un produit pour afficher sa liste des items,
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
<h2>Items for product :
<h:outputText value="#{catalog.product.name}"/>
</h2>
<h:form>
<h:dataTable value="#{catalog.items}" var="item">
<h:column>
<h:commandLink action="#{catalog.doFindItem}">
<h:outputText value="#{item.name}"/>
<f:param name="itemId" value="#{item.id}"/>
</h:commandLink>
</h:column>
<h:column>
<h:outputText value="#{item.unitCost}"/>
$
</h:column>
</h:dataTable>
</h:form> |
cela génère le message d'erreur suivant: javax.servlet.ServletException: failed to lazily initialize a collection of role: metier.entities.Product.items, no session or session was closed javax.faces.webapp.FacesServlet.service(FacesServlet.java:606).
Je remercie d'avantage pour votre aide car ça fait plusieurs que je suis bloqué à ce problème. Merci!