休眠删除错误:批量更新返回意外行计数

Kid*_*ond 21 java methods dao hibernate

我在下面写了这个方法,假设从数据库中删除一个成员记录.但是当我在我的servlet中使用它时,它会返回一个错误.

会员道教班

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

控制器部分

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

    MemberDao.deleteMember(member);

    nextPage = "ledenlijst.jsp";
}
Run Code Online (Sandbox Code Playgroud)

HTTP状态500

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
Run Code Online (Sandbox Code Playgroud)

有时,当我尝试多次执行页面时,它甚至会抛出此错误.

org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
Run Code Online (Sandbox Code Playgroud)

有人知道究竟是什么导致了这些错误吗?

Ash*_*tap 44

错误可能是由几件事引起的.我没有把它归功于它,在这里找到它.

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

另请参阅beny23的这个答案,它提供了一些进一步的提示来找到问题.

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

  • 对象是陈旧的:Hibernate从会话中缓存对象.如果对象被修改,并且Hibernate不知道它,它将抛出此异常 - 请注意StaleStateException (2认同)