一尘不染

Hibernate删除错误:批处理更新返回了意外的行数

hibernate

我在下面编写了此方法,该方法假定是从数据库中删除成员记录。但是,当我在servlet中使用它时,它将返回错误。

会员班

public static void deleteMember(Member member) {
    Session hibernateSession = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction tx = hibernateSession.beginTransaction();
    hibernateSession.delete(member);
    tx.commit();
}

控制器部分

if(delete != null) {
    HttpSession httpSession = request.getSession();
    Member member = (Member) httpSession.getAttribute("member");

    MemberDao.deleteMember(member);

    nextPage = "ledenlijst.jsp";
}

HTTP状态500

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

有时,当我尝试多次执行页面时,甚至会引发此错误。

org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update

有人知道究竟是什么引起这些错误吗?


阅读 376

收藏
2020-06-20

共1个答案

一尘不染

该错误可能是由多种原因引起的。我不为此而功劳,在这里找到了它。

  1. 在提交对象之前刷新数据可能会导致清除所有等待持久化的对象。
  2. 如果对象具有自动生成的主键,并且您正在强制分配键
  3. 如果在将对象提交到数据库之前正在清理对象。
  4. 零或不正确的ID:如果将ID设置为零或其他值,Hibernate将尝试更新而不是插入。
    5.
    对象是陈旧的:Hibernate从会话中缓存对象。如果对象被修改,而Hibernate不知道,它将抛出此异常—请注意StaleStateException

还要看一下beny23的答案,它给出了一些进一步的提示来发现问题。

  • 在您的hibernate配置中,将hibernate.show_sql设置为true。这应该向您显示已执行并导致问题的SQL。
  • 将Spring和Hibernate的日志级别设置为DEBUG,这将再次使您更好地了解导致问题的行。
  • 创建一个无需在Spring中配置事务管理器即可复制问题的单元测试。这应该使您对有问题的代码行有了更好的了解。
2020-06-20