Firebirdデータベースのテーブルに着信データを書き込むJavaプログラムを調整しています。データベース接続は、Hibernateによって抽象化されています。データを保存するコマンドはsaveOrUpdate()です。これらの入ってくるデータのいくつかは新しいものであり、挿入する必要があり、既に存在し、更新する必要があります。saveOrUpdate()と組み合わせてデータベースからデータを削除する
これまでのところうまくいきます。 データベースから行を削除するときに問題が発生しました。別のスレッドによって。ここで来る次の時間データはHibernateがまだ更新しようと、削除する前にすでに存在し、それが更新次回を試していないので、エントリの削除を休止指示する可能性がある例外
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1[/code]
がスローされますが、挿入物?
プログラムは、新しいセッションを毎回開くが、格納されたデータにアクセスする際、現在のセッションを取得していない:DB内のデータを保存しながら
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
// do sth with session
session.getTransaction().commit();
更新する前に行の存在を確認するために休止状態を確認できますか?それ、どうやったら出来るの? – telandor
はい、Hibernate saveOrUpdate標準メソッドを使うことができます。これは、指定されたプライマリキーがすでにDBに存在するかどうかをチェックし、存在する場合はレコードを更新します。詳細はhttp://howtodoinjava.com/hibernate/save-and-saveorupdate-for-saving-hibernate-entities/ –
今あなたが何を意味しているか知っています。残念ながらsaveOrUpdate()をすでに使用していました。それを言いたくて申し訳ありません。私は自分の投稿を更新しました。 – telandor