我正在尝试使用休眠模式从数据库中删除对象 当我单击“删除”按钮时,休眠状态发生错误
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);
}
}
答案 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();