我正在尝试使用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";
}
答案 0 :(得分:0)
您正在打开新的会话,但是如果执行这部分代码,则永远不会关闭它们:
session = this.sessionFactory.openSession();
如果您真的想保持这种逻辑:
try {
session = this.sessionFactory.getCurrentSession();
} catch (HibernateException ex) {
session = this.sessionFactory.openSession();
}
您必须确保在完成工作后以及使用session.close()
而不是openSession()
之后添加getCurrentSession()
;