休眠:没有活动事务,删除无效

时间:2018-07-24 09:21:59

标签: java 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 个答案:

答案 0 :(得分:2)

对数据库执行CRUD操作时,一定要检查所使用的会话是否打开。如果已打开,则还应检查事务是否处于活动状态。如果事务处于活动状态,则可以继续进行操作。但是,如果交易未激活,则必须手动进行交易。如果会话未打开,则应该获得一个新会话。

用于检查会话是否打开

if(session.isOpen()){
}

获取新会话

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

用于检查交易活动

if(transaction.isActive()){}

获取新交易

transaction.begin();

您不应在该交易处于活动状态时开始交易,否则会导致获取错误

答案 1 :(得分:1)

该异常很简单,说:

  

没有有效的交易,删除无效

所以这里的问题是您的会话没有任何打开/活动的transaction,这是由于以下原因造成的:

transaction = session.getTransaction();

要从transaction获取session的位置,而无需检查其是否处于活动状态。

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

transaction = session.beginTransaction();