获取HibernateException:在尝试更新时非法尝试将代理与两个打开的会话相关联

时间:2019-01-23 08:36:27

标签: java hibernate spring-mvc orm

我正在尝试使用Hibernate更新表中的元素,但出现以下错误:

  

发生意外错误(类型=内部服务器错误,   状态= 500)。非法试图将一个代理与两个打开   会议;嵌套的异常是org.hibernate.HibernateException:   非法尝试将代理与两个打开的会话相关联

DAO:

    @Override
public Demande getDemandeById(int id) {
    // TODO Auto-generated method stub
    Session session;
     try {
         session = this.sessionFactory.getCurrentSession();
        } catch (HibernateException ex) {
            session = this.sessionFactory.openSession();
        }

    Demande d = (Demande) session.load(Demande.class, new Integer(id));
    return d;
}
@Override
public void updateDemande(Demande d) {
    // TODO Auto-generated method stub
    Session session;
     try {
         session = this.sessionFactory.getCurrentSession();
        } catch (HibernateException ex) {
            session = this.sessionFactory.openSession();
        }

    session.update(d);

    logger.info("Person updated successfully, Person Details="+d);
}

控制器:

@GetMapping("rh/editProfilDemande")
public String  RHEditProfilForm(Model m, @RequestParam int id_demande) {  
    this.profil_id = pf.getIdProfil();
    Demande d = demandeService.getDemandeById(id_demande);
    this.idDemande = id_demande; 

    m.addAttribute("profil", pf);

    m.addAttribute("demande", d); 
    return "RHEditProfil";


}   

@PostMapping("rh/editProfilDemande")
public String  RHEditProfil(Model m, Profil pf) {
    Demande d= demandeService.getDemandeById(this.idDemande);



    demandeService.updateDemande(d);
     m.addAttribute("demande",d);
    return "RHDemandeTraiteSuccess";


} 

1 个答案:

答案 0 :(得分:0)

您正在打开新的会话,但是如果执行这部分代码,则永远不会关闭它们:

session = this.sessionFactory.openSession();

如果您真的想保持这种逻辑:

  try {
     session = this.sessionFactory.getCurrentSession();
    } catch (HibernateException ex) {
        session = this.sessionFactory.openSession();
    }

您必须确保在完成工作后以及使用session.close()而不是openSession()之后添加getCurrentSession()