删除函数org.hibernate.HibernateException:非法尝试将集合与两个打开的会话相关联

时间:2017-12-08 07:56:43

标签: java hibernate jsf orm

有谁知道如何解决这个问题?我试图删除一个实体,但始终显示此错误消息。

这是使用的代码:

@Override
public void remove(t_diklat diklat) {


      Session session = HibernateUtil.getSessionFactory().openSession();

    try {
        session.getTransaction().begin();
        session.delete(diklat);
        session.getTransaction().commit();
    } catch (Exception ex) {

        throw ex;
    }

 public String delete() {
 t_diklat diklat = (t_diklat)(listDiklat.getRowData());
        diklatDao dao = new diklat_Impl();
        dao.remove(diklat);
        return "diklat_client";


    }

这是我的道歉

public interface diklatDao {
    public t_diklat getTbl_diklat(Long id);
    public void Save(t_diklat diklat);
    public void remove(t_diklat diklat);
    public void update(t_diklat diklat);

    public List<t_diklat> ListTable();

}

我还将@OneToMany(mappedBy = "diklat_id_5", cascade = CascadeType.ALL)添加到model.class,但仍然没有。

1 个答案:

答案 0 :(得分:0)

我很确定:

public String delete()
在检索数据时,在已打开的会话中调用

方法:

t_diklat diklat = (t_diklat)(listDiklat.getRowData());

在您点击dao.remove()方法之前。

在dao中,你打开另一个会话并尝试传递一个已经与已经打开但仍未关闭的会话相关联的实体。

解决方案是使用:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

而不是:

Session session = HibernateUtil.getSessionFactory().openSession();

修改

尽量不要打开任何新事务,也不要在dao中执行提交。外部会话管理应该足够..所以在你的道歉中:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.delete(diklat);