0

i have this problem when i want to add a new product exactly when i want to select from cascading dropdown list, this exception below is thrown :

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.gestion.mvc.entities.Rubrique.articles, could not initialize proxy - no Session

Here is my entities

Article :

@Entity
@Table(name = "article")
public class Article implements Serializable {

@Id
@GeneratedValue
private Long idArticle;

private String codeArt;

private String refArt;

private String refArtPro;

private String designationC;

private String designationL;

private BigDecimal prixUnitaireDevise;

private BigDecimal pump;

private String obligation;

private BigDecimal quantiteMax;

private BigDecimal quantiteMin;

private BigDecimal quantiteReapp;

private BigDecimal seuilDeReapp;

private BigDecimal quantiteCibleAnnee;

private BigDecimal quantite;

private BigDecimal prixUnitaireHT;

private BigDecimal tauxTva;

private BigDecimal prixUnitaireTTC;

@ManyToOne
@JoinColumn(name = "idRubrique")
private Rubrique rubrique;

@ManyToOne
@JoinColumn(name = "idFournisseur")
private Fournisseur fournisseur;

private String paysProvenance;

private String paysOrigine;

private String monnaie;

@ManyToOne
@JoinColumn(name = "idDrapeau")
private Drapeau drapeau;

@ManyToOne
@JoinColumn(name="idSRubrique" )
private SRubrique srubrique;

@ManyToOne
@JoinColumn(name="idSSRubrique")
private SSRubrique ssrubrique;

public Article() {
    super();
}

public Long getIdArticle() {
    return idArticle;
}

public void setIdArticle(Long idArticle) {
    this.idArticle = idArticle;
}

public String getCodeArt() {
    return codeArt;
}

public void setCodeArt(String codeArt) {
    this.codeArt = codeArt;
}

public String getRefArt() {
    return refArt;
}

public void setRefArt(String refArt) {
    this.refArt = refArt;
}

public String getRefArtPro() {
    return refArtPro;
}

public void setRefArtPro(String refArtPro) {
    this.refArtPro = refArtPro;
}

public String getDesignationC() {
    return designationC;
}

public void setDesignationC(String designationC) {
    this.designationC = designationC;
}

public BigDecimal getQuantite() {
    return quantite;
}

public void setQuantite(BigDecimal quantite) {
    this.quantite = quantite;
}

public String getDesignationL() {
    return designationL;
}

public void setDesignationL(String designationL) {
    this.designationL = designationL;
}

public BigDecimal getPrixUnitaireHT() {
    return prixUnitaireHT;
}

public void setPrixUnitaireHT(BigDecimal prixUnitaireHT) {
    this.prixUnitaireHT = prixUnitaireHT;
}

public BigDecimal getTauxTva() {
    return tauxTva;
}

public void setTauxTva(BigDecimal tauxTva) {
    this.tauxTva = tauxTva;
}

public BigDecimal getPrixUnitaireTTC() {
    return prixUnitaireTTC;
}

public void setPrixUnitaireTTC(BigDecimal prixUnitaireTTC) {
    this.prixUnitaireTTC = prixUnitaireTTC;
}

public Rubrique getRubrique() {
    return rubrique;
}

public void setRubrique(Rubrique rubrique) {
    this.rubrique = rubrique;
}

public Fournisseur getFournisseur() {
    return fournisseur;
}

public void setFournisseur(Fournisseur fournisseur) {
    this.fournisseur = fournisseur;
}

public BigDecimal getPrixUnitaireDevise() {
    return prixUnitaireDevise;
}

public void setPrixUnitaireDevise(BigDecimal prixUnitaireDevise) {
    this.prixUnitaireDevise = prixUnitaireDevise;
}

public BigDecimal getPump() {
    return pump;
}

public void setPump(BigDecimal pump) {
    this.pump = pump;
}

public String getObligation() {
    return obligation;
}

public void setObligation(String obligation) {
    this.obligation = obligation;
}

public BigDecimal getQuantiteMax() {
    return quantiteMax;
}

public void setQuantiteMax(BigDecimal quantiteMax) {
    this.quantiteMax = quantiteMax;
}

public BigDecimal getQuantiteMin() {
    return quantiteMin;
}

public void setQuantiteMin(BigDecimal quantiteMin) {
    this.quantiteMin = quantiteMin;
}

public BigDecimal getQuantiteReapp() {
    return quantiteReapp;
}

public void setQuantiteReapp(BigDecimal quantiteReapp) {
    this.quantiteReapp = quantiteReapp;
}

public BigDecimal getSeuilDeReapp() {
    return seuilDeReapp;
}

public void setSeuilDeReapp(BigDecimal seuilDeReapp) {
    this.seuilDeReapp = seuilDeReapp;
}

public BigDecimal getQuantiteCibleAnnee() {
    return quantiteCibleAnnee;
}

public void setQuantiteCibleAnnee(BigDecimal quantiteCibleAnnee) {
    this.quantiteCibleAnnee = quantiteCibleAnnee;
}

public Drapeau getDrapeau() {
    return drapeau;
}

public void setDrapeau(Drapeau drapeau) {
    this.drapeau = drapeau;
}

public String getPaysProvenance() {
    return paysProvenance;
}

public void setPaysProvenance(String paysProvenance) {
    this.paysProvenance = paysProvenance;
}

public String getPaysOrigine() {
    return paysOrigine;
}

public void setPaysOrigine(String paysOrigine) {
    this.paysOrigine = paysOrigine;
}

public String getMonnaie() {
    return monnaie;
}

public void setMonnaie(String monnaie) {
    this.monnaie = monnaie;
}

public SRubrique getSrubrique() {
    return srubrique;
}

public void setSrubrique(SRubrique srubrique) {
    this.srubrique = srubrique;
}

public SSRubrique getSsrubrique() {
    return ssrubrique;
}

public void setSsrubrique(SSRubrique ssrubrique) {
    this.ssrubrique = ssrubrique;
}

}

Rubrique:

@Entity
@Table(name = "rubrique")
public class Rubrique implements Serializable {

@Id
@GeneratedValue
private Long idRubrique;

private String codeRubrique;

private String designation;

@OneToMany(mappedBy = "rubrique" )
private List<Article> articles;

@OneToMany(mappedBy = "rubrique")
private List<SRubrique> srubriques;

@OneToMany(mappedBy ="rubrique")
private List <Fournisseur> fournisseurs;

public Rubrique() {

}

public Long getIdRubrique() {
    return idRubrique;
}

public void setIdRubrique(Long idRubrique) {
    this.idRubrique = idRubrique;
}

public String getCodeRubrique() {
    return codeRubrique;
}

public void setCodeRubrique(String codeRubrique) {
    this.codeRubrique = codeRubrique;
}

public String getDesignation() {
    return designation;
}

public void setDesignation(String designation) {
    this.designation = designation;
}

@JsonIgnore
public List<Article> getArticles() {
    return articles;
}

public void setArticles(List<Article> articles) {
    this.articles = articles;
}

@JsonIgnore
public List<SRubrique> getSrubriques() {
    return srubriques;
}

public void setSrubriques(List<SRubrique> srubriques) {
    this.srubriques = srubriques;
}

@JsonIgnore
public List<Fournisseur> getFournisseurs() {
    return fournisseurs;
}

public void setFournisseurs(List<Fournisseur> fournisseurs) {
    this.fournisseurs = fournisseurs;
}

}

Article DAO :

public interface IArticleService {

public Article save(Article entity);

public Article update(Article entity);

void remove(long id);

public List<Article> selectAll();

public List<Article> selectAll(String sortField, String sort);

public Article getById(long id);

public Article findOne(String paramName, Object paramValue);

public Article findOne(String[] paramName, Object[] paramValue);

public int findCountBy(String paramName, String paramValue);

public List<Article> findByFournisseur(long idFrn);

public Article getArticleByCode(String codeArt);

int getCount(String paramName);

}

Article Service :

@Transactional
public class ArticleServiceImpl implements IArticleService   {

private IArticleDao dao;


public void setDao(IArticleDao dao) {
    this.dao = dao;
}

@Override
public Article save(Article entity) {

    return dao.save(entity);
}

@Override
public Article update(Article entity) {
    return dao.update(entity);
}

@Override
public void remove(long id) {
    dao.remove(id);     
}

@Override
public List<Article> selectAll() {
    return dao.selectAll();
}

@Override
public List<Article> selectAll(String sortField, String sort) {
    return dao.selectAll(sortField, sort);
}

@Override
public Article getById(long id) {
    return dao.getById(id);
}

@Override
public Article findOne(String paramName, Object paramValue) {
        return dao.findOne(paramName, paramValue);
}

@Override
public Article findOne(String[] paramName, Object[] paramValue) {
    return dao.findOne(paramName, paramValue);
}

@Override
public int findCountBy(String paramName, String paramValue) {
        return dao.findCountBy(paramName, paramValue);
}

@Override
public List<Article> findByFournisseur(long idFrn) {
    return dao.findByFournisseur(idFrn);
}

@Override
public Article getArticleByCode(String codeArt) {

    return dao.getArticleByCode(codeArt);
}

@Override
public int getCount(String paramName) {

    return dao.getCount(paramName);
}

}

Controller, which calls the model look like :

@Controller
@RequestMapping(value = "/article")
public class ArticleController {

@Autowired
private IArticleService articleService;

@Autowired
private IRubriqueService rubriqueService;

@Autowired
private IFournisseurService fournisseurService;

@Autowired
private ISRubriqueService srubriqueService;

@Autowired
private ISSRubriqueService ssrubriqueService;

@Autowired
private IDrapeauService drapeauService;

@Autowired
private IPaysService paysService;

@Autowired
GenerateCodeAuto genCodeArt;

@Autowired
@Qualifier("articleExporter")
private FileExporter exporter;

@RequestMapping(value = "/")
public String article(Model model) {
    List<Article> listArticle = articleService.selectAll();
    if (listArticle == null) {
        listArticle = new ArrayList<Article>();
    }
    model.addAttribute("listArt", listArticle);
    return "article/article";
}

@RequestMapping(value = "/loadArticle")
@ResponseBody
public List<Article> JSONArticle() {
    return articleService.selectAll();
}

@RequestMapping(value = "/JSONmodifier/{idArticle}")
@ResponseBody
public Article JSONmodifierArticle(Model model, @PathVariable Long idArticle) {
    return articleService.getById(idArticle);
}

@RequestMapping(value = "/nouveau", method = RequestMethod.GET)
public String ajouterArticle(Model model) {
    Article article = new Article();
    article.setCodeArt(genCodeArt.GenerateCodeArt("ART%02d", "idArticle"));
    List<Rubrique> listRubrique = rubriqueService.selectAll("designation", "asc");
    List<Fournisseur> listFournisseur = fournisseurService.selectAll();
    List<Drapeau> listDrapeau = drapeauService.selectAll();
    List<Pays> listPays = paysService.selectAll();
    if (listRubrique == null) {
        listRubrique = new ArrayList<Rubrique>();
    }
    if (listFournisseur == null) {
        listFournisseur = new ArrayList<Fournisseur>();
    }
    if (listDrapeau == null) {
        listDrapeau = new ArrayList<Drapeau>();
    }
    if (listPays == null) {
        listPays = new ArrayList<Pays>();
    }
    model.addAttribute("article", article);
    model.addAttribute("listRub", listRubrique);
    model.addAttribute("listFrn", listFournisseur);
    model.addAttribute("listDrp", listDrapeau);
    model.addAttribute("listPays", listPays);
    return "article/ajouterArticle";
}

@RequestMapping(value = "/enregistrer")
public String enregistrerArticle(Model model, Article article) {
    if (article != null) {
        if (article.getIdArticle() != null) {
            articleService.update(article);
        } else {
            articleService.save(article);
        }
    }
    return "redirect:/article/";
}

@RequestMapping(value = "/modifier", method = RequestMethod.GET)
public String modifierArticle(Model model, @RequestParam("idArticle") Long idArticle) {
    Article article = new Article();
    if (idArticle != null) {
        article = articleService.getById(idArticle);
        List<Rubrique> listRubrique = rubriqueService.selectAll();
        List<Fournisseur> listFournisseur = fournisseurService.selectAll();
        List<Drapeau> listDrapeau = drapeauService.selectAll();
        List<Pays> listPays = paysService.selectAll();
        Long idRub = article.getRubrique().getIdRubrique();
        List<SRubrique> listSRub = srubriqueService.findByRubrique(idRub);
        Long idSRub;
        List<SSRubrique> listSSRub;
        if (article.getSrubrique().getIdSRubrique() != null) {
            idSRub = article.getSrubrique().getIdSRubrique();
        } else {
            idSRub = null;
        }
        listSSRub = ssrubriqueService.findBySRubrique(idSRub);
        if (listRubrique == null) {
            listRubrique = new ArrayList<Rubrique>();
        }
        if (listFournisseur == null) {
            listFournisseur = new ArrayList<Fournisseur>();
        }
        if (listDrapeau == null) {
            listDrapeau = new ArrayList<Drapeau>();
        }
        if (listPays == null) {
            listPays = new ArrayList<Pays>();
        }
        if (listSRub == null) {
            listSRub = new ArrayList<SRubrique>();
        }
        if (listSSRub == null) {
            listSSRub = new ArrayList<SSRubrique>();
        }
        model.addAttribute("listRub", listRubrique);
        model.addAttribute("listFrn", listFournisseur);
        model.addAttribute("listDrp", listDrapeau);
        model.addAttribute("listPays", listPays);
        model.addAttribute("listSRub", listSRub);
        model.addAttribute("listSSRub", listSSRub);
        if (article != null) {
            model.addAttribute("article", article);
        }
    }
    return "article/ajouterArticle";
}

@RequestMapping(value = "/supprimer/{idArticle}")
public String supprimerArticle(Model model, @PathVariable Long idArticle) {
    if (idArticle != null) {
        Article article = articleService.getById(idArticle);
        if (article != null) {
            articleService.remove(idArticle);
        }
    }
    return "redirect:/article/";
}

@RequestMapping(value = "/export/")
public String ExportArticles(HttpServletResponse response) {

    exporter.exportDataToExcel(response, null, null);
    return "article/article";
}

@RequestMapping(value = "/loadSrub", method = RequestMethod.GET)
@ResponseBody
public List<SRubrique> ajouterSRub(@RequestParam(value = "idRubrique") long id) {
    return srubriqueService.findByRubrique(id);
}

@RequestMapping(value = "/loadSSrub", method = RequestMethod.GET)
@ResponseBody
public List<SSRubrique> ajouterSSRub(@RequestParam("idSRubrique") long id) {
    return ssrubriqueService.findBySRubrique(id);
}

}

JSP Page : this picture shows when the exception is raised

i think the exception is raised by this function ajouterSRub(@RequestParam(value = "idRubrique") long id ), in this function i'm trying to retrieve the id of rubrique then with that id retrieve the list of sous rubrique, after that send it to javascript page in order to display it into sous Rubrique dropdown. Everything was working fine untill the day i have implemented the spring security.

Nassim
  • 9
  • 3
  • Alle the collections in SRubrique are lazy initalized. So when you return a SRubrique or a list of SRubrique you first have to initalize what you need. Read more about the options here: https://thoughts-on-java.org/5-ways-to-initialize-lazy-relations-and-when-to-use-them/ – Simon Martinelli Jan 05 '20 at 12:23
  • what do you mean about to initialize what you need ?? this exception is raised by the collection of articles in Rubrique entity. can you explain to me why the problem is thrown because of SRubrique. here is the implementation of findByRubrique : ``public List findByRubrique(long idRub){ Query query = em.createQuery("from SRubrique where rubrique.idRubrique = :idRubrique order by designation"); query.setParameter("idRubrique", idRub); return query.getResultList(); }`` – Nassim Jan 05 '20 at 14:50
  • Please read https://stackoverflow.com/questions/2192242/what-is-lazy-loading-in-hibernate – Simon Martinelli Jan 05 '20 at 14:55
  • i have already read it !! i know that lazy fetching decides whether to load child objects while loading the Parent Object. it makes sure that the child objects are not loaded unless they are explicitly invoked in the application and also by default, hibernate uses lazy select fetching for collections (OneToMany asssociations).the problem is can't figure out how to deal with this exception. – Nassim Jan 05 '20 at 16:07
  • The problem is that you do not fetch all the collections during your transaction. If you try to access a not initialized collection then you get the error from above. You could use Hibernate.initialize(result.getSrubrique()) (or whatever collection you want) in your DAO implementation to fetch the needed collections. Use this after you fetch the data from the DB. – M46 Jan 08 '20 at 15:53
  • sorry for the delayed response, i tried what you suggested but it doesn't work. here the new implementation of findByRubrique : ``public List findByRubrique(long idRub){ Query query = em.createQuery("from SRubrique where rubrique.idRubrique = :idRubrique order by designation"); query.setParameter("idRubrique", idRub); List list = query.getResultList(); for (SRubrique sr : list ) { Hibernate.initialize(sr.getArticles()); } return query.getResultList(); }`` – Nassim Jan 09 '20 at 10:30

0 Answers0