0

私は 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 を見ると、私はアイデアがありません。うまくいけば、誰かが私を助けることができます! ここで永続化エラーがあったことをマークできるように、親オブジェクト (問題のあるすべての子オブジェクトではありません)のデータベース行にステータス コードを書き込みます。

ありがとう!

4

1 に答える 1

0

このような例外がある場合、トランザクションはロールバックのみとしてマークされてJPA.setRollbackOnly()いると思います( 経由。そして、現在のトランザクションをコミットして新しいトランザクションを開始するだけです(JPAPlugin.closeTxおよび経由startTx)。

于 2013-03-28T08:17:07.350 に答える