首页 > 解决方案 > 如何修复休眠异常“无法延迟初始化角色集合”

问题描述

当我想添加新产品时,我遇到了这个问题,而我想从级联下拉列表中进行选择时,会抛出以下异常:

org.hibernate.LazyInitializationException:无法延迟初始化角色集合:com.gestion.mvc.entities.Rubrique.articles,无法初始化代理 - 无会话

这是我的实体

文章 :

@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;
}

}

量规:

@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;
}

}

文章 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);

}

文章服务:

@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
@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 页面: 此图显示引发异常的时间

我认为这个函数 ajouterSRub(@RequestParam(value = "idRubrique") long id ) 引发了异常,在这个函数中,我试图检索 rubrique 的 id,然后用该 id 检索 rubrique 的列表,之后将其发送到 javascript 页面,以便将其显示到 sous Rubrique 下拉列表中。直到我实施春季安全措施的那一天,一切都运行良好。

标签: javaspringhibernatespring-mvcjsp

解决方案


推荐阅读