代码之家  ›  专栏  ›  技术社区  ›  yali

Hibernate:删除在没有活动事务的情况下无效

  •  1
  • yali  · 技术社区  · 8 年前

    我正在尝试使用hibernate从数据库中删除对象 当我单击delete按钮时,hibernate中有错误

    org.hibernate.HibernateException: delete is not valid without active transaction
    

    这是我删除时的代码

           int id = eStoreUserDTO.geteStoreStoresDTO().getId();
            StringBuilder hql = new StringBuilder();
    
            hql.append("select distinct eStoreStoresDTO from EStoreStoresDTO"
                    + " eStoreStoresDTO where eStoreStoresDTO.id = "+ id);
            List<EStoreStoresDTO> store = DaoFactory.getDao().selectAllHql(hql + "");
    
            eStoreUserDTOs.remove(eStoreUserDTO);
            DaoFactory.getDao().delete(eStoreUserDTO);
    
            EStoreStoresDTO dto = store.get(0);
            DaoFactory.getDao().delete(dto);
    

    删除方法:

    @Override public void delete(Object object) throws DaoException { 
        Session session = null; 
        Transaction transaction = null; 
        try { 
            session = getCurrentSession(); 
            transaction = session.getTransaction(); 
            session.delete(object); 
            transaction.commit(); 
        } catch (Exception e) { 
            if (transaction != null) { 
                transaction.rollback(); 
            } 
            throw new DaoException(e); 
        } 
    }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Deadpool    8 年前

    当您在数据库上执行CRUD操作时,一定要检查您正在使用的会话是否打开。如果事务处于打开状态,则还应检查事务是否处于活动状态。如果事务处于活动状态,则可以继续操作。但如果事务不是活动的,则必须手动获取事务。如果会话未打开,则应获取新会话。

    用于检查会话是否打开

    if(session.isOpen()){
    }
    

    获取新会话

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

    用于检查事务活动性

    if(transaction.isActive()){}
    

    用于获取新事务

    transaction.begin();
    

    当事务处于活动状态时,不应开始该事务,否则将导致

        2
  •  1
  •   cнŝdk    8 年前

    例外很简单,它说:

    删除在没有活动事务的情况下无效

    所以这里的问题是你的会话没有任何打开/活动的 transaction ,这是因为:

    transaction = session.getTransaction();
    

    你在哪里得到的 交易 从 session 不检查它是否激活。

    为了避免此问题,您可以开始一个新事务,以确保在这种情况下不会失败,因此请将代码更改为:

    transaction = session.beginTransaction();