【问题标题】:Hibernate : delete is not valid without active transaction休眠:没有活动事务,删除无效
【发布时间】:2018-12-31 20:42:54
【问题描述】:

我正在尝试使用休眠从数据库中删除对象 当我点击删除按钮时,休眠中出现错误

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

【问题讨论】:

  • 1) 请复制您的代码,不要放图片。 2)你可以添加你的 DaoFactory.getDao() 的代码吗?谢谢
  • @Leviand ` @Override public void delete(Object object) throws DaoException { Session session = null;交易交易=空;尝试 { session = getCurrentSession();事务 = session.getTransaction();会话.删除(对象);事务.commit(); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } 抛出新的 DaoException(e); } }`
  • @Leviand:抱歉,我拒绝了您的编辑(至少是这样投票的)。现在只看到您从评论中获取代码,在编辑的评论中错过了代码。不幸的是,不能“撤消”我的投票。对不起

标签: java hibernate


【解决方案1】:

当您对数据库执行 CRUD 操作时,您绝对应该检查您正在使用的会话是否打开。如果它是打开的,那么您还应该检查交易是否处于活动状态。如果交易处于活动状态,那么您可以继续您的操作。但如果交易不活跃,您必须手动获取交易。如果会话没有打开,你应该得到一个新的会话。

用于检查会话是否打开

if(session.isOpen()){
}

获取新会话

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

用于检查交易活跃度

if(transaction.isActive()){}

获取新交易

transaction.begin();

当交易处于活动状态时,您不应该开始交易,否则会导致您收到错误

【讨论】:

    【解决方案2】:

    例外很简单,说:

    如果没有活动的交易,删除是无效的

    所以这里的问题是您的会话没有任何打开/活动的transaction,这是由于该行:

    transaction = session.getTransaction();
    

    您从session 获取transaction 的位置而不检查它是否处于活动状态。

    为避免此问题,您可以开始一个新事务以确保您不会陷入这种情况,因此将您的代码更改为:

    transaction = session.beginTransaction();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-19
      • 2015-10-19
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 2014-08-13
      • 2012-08-13
      相关资源
      最近更新 更多