2012-01-05 20 views
4

私はJBoss AS 6からJBoss AS 7への移行プロセスに入っており、テストに問題があります。のは、簡単なエンティティEJBを想定してみましょう:JBoss AS 7のPersistenceExceptionまたはConstraintViolationExceptionをキャッチ

@Stateless Bean
@Entity public class MyTest implements Serializable 
{ 
    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 

    @NotNull 
    private String headline; 
} //getter/setter 

私は(前JBoss5とJBoss6付きなど)このような何かをやっている:

@Inject private EntityManager em; 

public <T extends Object> T persist(T o) throws MyContraintViolationException 
{ 
    System.out.println("***************** persist:"); 
    try 
    { 
     em.persist(o); 
    } 
    catch (Exception e) 
    { 
     System.out.println("*************** exception:"); 
     // Further investigation of Exception e, 
     // then throw MyContraintViolationException 
    } 
} 

私は違反していない場合、これが正常に動作します@NotNullという制約があります。 headline==null場合、私は例外を取得しますが、私のcatchブロック入力しないでん:

12:19:45 INFO ******************** persist: 
12:19:45 WARN [com.arjuna.ats.arjuna] (management-handler-threads - 2) 
    ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for 
    SynchronizationImple< 0:ffffc0a801fb:4f969a6e:4f058744:9, 
    org.hibernate.engine.transaction.synchronization.internal. 
    [email protected] >: javax.persistence.PersistenceException: 
    error during managed flush 
... 
Caused by: javax.validation.ConstraintViolationException: Validation failed for 
    classes [my.test.MyTest] during persist time for groups 
    [javax.validation.groups.Default, ] List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='kann nicht null sein', 
    propertyPath=headline, rootBeanClass=class my.test.MyTest, 
    messageTemplate='{javax.validation.constraints.NotNull.message}'} 

私は、エラーメッセージは、JBossの以前のバージョンよりもはるかに詳細であることを見て幸せを、どのように私がすることができますキャッチa javax.validation.ConstraintViolationExceptionと私自身のMyContraintViolationExceptionスロー?デバッグメッセージ***** exceptionでもではありません。

答えて

11

メッセージと例外のスタックトレースを読めば、あなたが永続化するために、この例外が呼び出しによってスローされていないことがわかりますが、フラッシュによって:

エラー管理フラッシュ

persistはクエリを発行せず、データベースに何も保存しません。エンティティマネージャに一時的なエンティティを永続化させるように要求するだけです。フラッシュ時(すなわち、トランザクションのコミットの直前、またはHibernateが正しい結果を返すためにこのエンティティをデータベースに必要とするかもしれないクエリを実行する前)には、制約がチェックされ、insertクエリが実行されます。

flushを明示的に呼び出すこともできますが、Hibernateに複数のクエリをバッチ処理させずに、必要なときにのみ実行することで、アプリケーションのパフォーマンスに影響を与えます。私は単にネイティブ例外を使用します。なぜあなたはそのような変換が必要ですか?

0

エンティティマネージャを格納するためにEJBを使用しています。ステートレスEJBへのすべてのメソッド呼び出しは、トランザクションでラップされます。

EntityManagerを注入しました。つまり、EntityManagerもトランザクションの一部になります。 entityManagerはトランザクションコミット中にのみフラッシュされるため、このエラーメッセージは表示されません。あなたは何をすべき

は次のとおりです。

@Inject private EntityManager em; 

public <T extends Object> T persist(T o) throws MyContraintViolationException 
{ 
System.out.println("***************** persist:"); 
em.persist(o); 
try 
{ 
    em.flush(); 
} 
catch (Exception e) 
{ 
    System.out.println("*************** exception:"); 
    // Further investigation of Exception e, 
    // then throw MyContraintViolationException 
} 
} 
関連する問題