私は Play/Hibernate の初心者で、継承した Play 1.2.3 アプリを拡張しようとしています。これは、信頼できないデータを含むファイルの内容を解析し、それをデータベースに永続化しようとします。
アプリのコンテンツをデータベースに永続化する際に問題が発生した場合に、データベースにマークを付ける方法が必要です。アプリが SQL 例外をキャッチすることさえできず、完全にクラッシュする前に。そのため、catch ブロック内でエラーを適切に処理し、データベースに失敗を記録できることを期待して、すべてを try-catch ブロックでラップしました。
大まかに、これは私がコードを次のように更新したものです。
try {
MyObject parent = new MyObject();
// Persist the parent object and all of its child objects. The SQL errors are
// occurring on the child objects.
parent.save();
// Do a bit more processing
parent.status=1;
parent.save();
}
catch {
// This is what I'm trying to do -- set the failure status
// in the database to look at later
parent.status = 0;
parent.save();
}
MyObject は以下から継承します。
package models;
import javax.persistence.*;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public class MyObjectModel extends play.db.jpa.GenericModel { .. }
上記のコードは次をスローします。
ERROR: current transaction is aborted, commands ignored until end of transaction block
ERROR ~ Could not synchronize database state with session
parent.refresh()
の前に電話してみsave()
ましたが、結果は次のようになりました。
play.exceptions.JavaExecutionException: org.hibernate.exception.GenericJDBCException:
could not load an entity: [models.MyObject#465655]
新しい MyObject オブジェクトを作成して、以前に取得した Hibernate ID (および呼び出し) を含め、前のものと同じ値を指定しようとしましたmerge()
が、結果は次のようになりました。
PersistenceException occured : org.hibernate.PersistentObjectException:
detached entity passed to persist: models.MyObject
以前に取得した Hibernate ID を指定しないと、次のようにスローされます。
ERROR: current transaction is aborted, commands ignored until end of transaction block
PersistenceException occured : org.hibernate.exception.GenericJDBCException:
could not get next sequence value
上記が最善の方法であると考えました。これにより、やりたくないすべての子オブジェクトにカスケードすることができなくなります(明らかに再び失敗します)。
documentation を見ると、私はアイデアがありません。うまくいけば、誰かが私を助けることができます! ここで永続化エラーがあったことをマークできるように、親オブジェクト (問題のあるすべての子オブジェクトではありません)のデータベース行にステータス コードを書き込みます。
ありがとう!