为什么Hibernate会话对象的删除方法不起作用?

时间:2015-09-29 16:17:00

标签: java hibernate

为什么会话对象的删除方法在GenericDAOImpl.java中不起作用,既没有给出任何异常也没有显示任何输出。所有其他工作正常的方法public void delete(T object),请帮助我,对不起,如果我以错误的方式提出这个问题。

public class GenericDAOImpl<T> implements IGenericDAO<T> {
private SessionFactory sessionFactory;

public GenericDAOImpl(Class<T> cl, SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
    if (sessionFactory == null)
        throw new RuntimeException("Session factory is null!!!");
}

@Override
public T get(Class<T> cl, Long id) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    @SuppressWarnings("unchecked")
    T element = (T) session.get(cl, id);
    session.getTransaction().commit();
    return element;
}

@Override
public T get(Class<T> cl, Serializable obj) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();     
    @SuppressWarnings("unchecked")   
    T element = (T) session.get(cl, obj);
    session.getTransaction().commit();
    return element;
}

@Override
public T save(T object) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    session.save(object);
    session.getTransaction().commit();
    return object;
}

@Override
public void update(T object) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    session.update(object);
    session.getTransaction().commit();
}

@Override
public void delete(T object) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    session.delete(object);
    session.getTransaction().commit();
}

@SuppressWarnings("unchecked")
@Override   
public T findUniqueByQuery(String hsql, Map<String, Object> params) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery(hsql);
    if (params != null) {
        for (String i : params.keySet()) {
            query.setParameter(i, params.get(i));
        }
    }
    return (T) query.uniqueResult();
}

@SuppressWarnings("unchecked")
@Override
public List<T> query(String hsql, Map<String, Object> params) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery(hsql);
    if (params != null) {
        for (String i : params.keySet()) {
            query.setParameter(i, params.get(i));
        }
    }

    List<T> result = null;
    if ((hsql.toUpperCase().indexOf("DELETE") == -1)
            && (hsql.toUpperCase().indexOf("UPDATE") == -1)
            && (hsql.toUpperCase().indexOf("INSERT") == -1)) {
        result = query.list();
    } else {
    }
    session.getTransaction().commit();

    return result;
    }

}

3 个答案:

答案 0 :(得分:2)

正如评论中所调查,您正面临着

  

org.hibernate.TransactionException:嵌套事务不支持异常

这种情况正在发生,因为您开始执行事务并且在异常时从未提交或回滚。

我可以在你的代码中看到其中一个案例。请参阅下面的代码

@SuppressWarnings(&#34;未选中&#34)

@Override   
public T findUniqueByQuery(String hsql, Map<String, Object> params) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery(hsql);
    if (params != null) {
        for (String i : params.keySet()) {
            query.setParameter(i, params.get(i));
        }
    }
    return (T) query.uniqueResult();
}

看,你开始并且从未提交过交易。同样明智地检查项目中的所有其他地方。

答案 1 :(得分:2)

我有同样的问题。虽然我根本没有使用交易。我正在使用这样的命名:

Query query = session.getNamedQuery(EmployeeNQ.DELETE_EMPLOYEES);
int rows = query.executeUpdate();
session.close();

它返回了2行,但数据库仍然拥有所有记录。然后用以下代码结束上面的代码:

Transaction transaction = session.beginTransaction();
Query query = session.getNamedQuery(EmployeeNQ.DELETE_EMPLOYEES);
int rows = query.executeUpdate();
transaction.commit();
session.close();

然后它开始正常工作。我当时正在使用SQL服务器。但我想如果我们在代码上面使用h2(没有事务)也可以正常工作。

答案 2 :(得分:1)

{{1}}

很可能您在更新或插入后没有关闭会话,然后您正在执行删除。