2014-01-14 16 views
19

データベースからメンバーレコードを削除すると仮定して、このメソッドを以下に記述しました。しかし、サーブレットで使用すると、エラーが返されます。Hibernate Delete Error:予期しない行番号

MemberDaoクラス

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 

これらのエラーの原因を正確に知っている人はいますか?

+0

可能な複製:http://stackoverflow.com/questions/3853106/org-hibernate-stalestateexception-batch-update-returned-unexpected-row-count-fr –

+0

同じ「メンバー」を2回削除しようとしていますか? –

答えて

42

このエラーは、いくつか原因によって発生する可能性があります。私はそれのために信用を取っていないよ、それを見つけたhere

  1. Flushing the data before committing the object may lead to clear all object pending for persist.
  2. If object has primary key which is auto generated and you are forcing an assigned key
  3. if you are cleaning the object before committing the object to database.
  4. Zero or Incorrect ID: If you set the ID to zero or something else, Hibernate will try to update instead of insert.
  5. Object is Stale: Hibernate caches objects from the session. If the object was modified, and Hibernate doesn’t know about it, it will throw this exception — note the StaleStateException

はまた、問題を見つけるために、いくつかのさらなるヒントを与えbeny23によってthis answerを見てください。

  • In your hibernate configuration, set hibernate.show_sql to true. This should show you the SQL that is executed and causes the problem.
  • Set the log levels for Spring and Hibernate to DEBUG, again this will give you a better idea as to which line causes the problem.
  • Create a unit test which replicates the problem without configuring a transaction manager in Spring. This should give you a better idea of the offending line of code.
+2

Object is Stale:Hibernateはセッションからオブジェクトをキャッシュします。オブジェクトが変更され、Hibernateがそれを知らない場合、この例外がスローされます - StaleStateExceptionに注目してください –

0

私は同じ問題に直面していました。 コードはテスト環境で動作していました。しかし、ステージング環境では機能しませんでした。

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

問題は、テーブルがDBテーブルをテストする際に各プライマリキーに1つのエントリがあることでした。しかし、ステージングDBには、同じ主キーに対する複数のエントリがありました。 (問題はステージングDBにあるため、テーブルには主キー制約もなく複数のエントリがあった)

更新操作のたびに失敗する。単一のレコードを更新しようとし、更新カウントが1になることを期待します。しかし、同じ主キーのテーブルに3つのレコードがあるため、結果の更新カウントは3です。予想される更新カウントと実際の結果更新カウントが一致しなかった例外をスローしてロールバックします。

私は主キーが重複していて、主キーの制約が追加されているすべてのレコードを削除した後です。それは正常に動作しています。

0

これは私の場合の解決策です。おそらくそれはあなたを助けるでしょう!

実際には、データベースフィールドタイプ(postgreSQLのタイムスタンプ)とhibernate xmlファイルの同等のプロパティタイプ(カレンダー)の間の変換に問題がありました。 Hibernateはこの更新要求を実行したときに、要求が不正な変換カレンダ値で問い合わせを行うため、行を取得しませんでした。 これで、Hibernate xmlファイルの "Date"にある "Calendar"プロパティタイプを置き換えただけで問題は解決しました。

0

私は最近これを経験しました。私は更新メソッドを使用していましたが、既存のレコードがなかったので例外をスローしていました。私はメソッドをsaveOrUpdateに変更しました。出来た。

0

memcachedをセカンダリキャッシュとして使用している場合、この同じ問題がhibernate/JPA 2.1で発生しました。あなたはStaleStateExceptionと共に上記の例外を取得します。解像度はこれまでに指摘されたものとは異なっていた。

同じテーブルとトランザクション内で削除をインターリーブして選択(検索)する操作があると、休止状態になってその古くなった状態の例外が報告されることがあります。異なるエンティティ上で複数の同一の操作が同じテーブル上で発生するため、生産中にのみ発生します。システムのタイムアウトと例外の例外が表示されます。

解決策は、単により効率的であることです。ループでインターリーブするのではなく、どの項目を読み取る必要があるかを解決して、好ましくは1回の操作で解決してください。次に、別の操作で削除を実行します。繰り返しますが、同じトランザクション内のすべてが、読み取り/削除/読み込み/削除操作で冬眠しません。

これははるかに高速で、Hibernateのハウスキーピング負荷を大幅に軽減します。問題は解消されました。これは、セカンダリキャッシュを使用していて、セカンダリキャッシュなしで解決するためにデータベースに負荷がかかるため、発生しません。それは別の問題です。

1

私の場合、この例外は間違ったエンティティマッピングが原因でした。リレーションのカスケードはなく、参照された子エンティティは親から参照しようとする前に保存されませんでした。変更すると

@OneToMany(cascade = CascadeType.ALL) 

に変更されました。

この例外の原因を見つける最も確実な方法は、ログのshow_sqlとDEBUGレベルを設定することです。問題の原因となったsqlで停止します。私は自分のコードをチェックし

0
私はこの問題を抱えている

、何の問題もありませんでしたが、私は私のデータをチェックしたとき、私は、私は同じIDを持つ2つのエンティティを持っていた、見つけました!

したがって、flush()は、バッチ更新のために1つずつ動作し、2つの行を検出したため、機能しませんでした。したがって、それは更新されず、例外がスローされましたが、それは私の問題でした。私はそれがあなたのためにうまくいくかどうかわからない!

0

エンティティは、彼がデータベースにフラッシュしたいHibernateの通知はまさにそれがトランザクションの開始時にあったようでない場合にスローされる例外 org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 使用。

私は、私に起こる2つの異なるユースケースをさらに詳しく説明しましたhere

関連する問題