2017-04-12 5 views
0

これは私の最初の投稿ですので、ここのリソースは優れているので、私は本当に頭を傷つけているに違いありません。自動フラッシュ中のHibernateロールバックエラー/トランザクションメソッドを残すコミット

Spring MVC 4.2.5。 hibernate-core-5.1.0 JDK8

@Transactionalメソッドを呼び出すときにトランザクションがロールバックされない問題があります。

@Transactional(propagation=Propagation.REQUIRED,readOnly=false,rollbackFor = Exception.class) 
public byte process(CommonDataBlock commonDataBlock) throws Exception { 

方法は、DAOオブジェクトを呼び出して、私たちのような(「データベースに」)、約8オブジェクトを保存言うことができます:付き

applicationPartyDao.saveApplicationParty(appParty); 

私が呼んでいる方法は、適切な設定を持っています

:私は通常のPOJOから上記取引方法「プロセス」を呼んでいる、開始時

this.getSessionFactory().getCurrentSession().save(appParty); 

:典型的なDAOだけのようなものをやって

 try { 
     // Database transaction starts/ends here 
     submitAccess.process(commonDataBlock); 
    } 
     catch (Exception e) { 
      logUtil.debug(this, "Error submitting application: "+e.getMessage()); 
      e.printStackTrace(); 
      return Codes.RET_BYPASS_ALL_ADAPTORS; 
    } 

(そのコメント非常に適切ではない、データベーストランザクションが起動し、「プロセス」メソッドで終了。)

だから、 - 'プロセスの内のコードに誤りがある場合にそれをすべてを「ロールバックされます'(意図的な引用符)。しかし、FKの問題やNOT NULLカラムなどのデータベースエラーが発生した場合は、ロールバックされません。

引用符は、私が思ったように、実際には「プロセス」メソッド内のエラーから、実際にはのエラーからロールバックされていないことを認識しているため、意図的です。これを終了しますか?

プロセスエラーと呼び出し側のpojoの間でデータベースエラーが発生しました。 Hibernateは第1レベルのデータを保存し、データベースにすべてのオブジェクトの書き込みを開始します。

「プロセス」メソッドのすべてをtry/catchしようとしましたが、そこにエラーが発生していないので(アクションを開始するときにメソッドが終了します)、スローされて捕捉されたものはありません。

呼び出し元pojoはエラーをキャッチしますが(nullでないデータ例外エラーが表示されます)、データベースにオブジェクトを書き込んでエラーの前に残しました。

ロールバックは良いですが、フォールトはそれ以降にあるようです - そのメソッドでエラーをキャッチしますが、メソッドを離れるとSpring/Hibernateはそのことを行い、コミットします...データベースに残されます。ロールバックはありません。 rollbackForは関連するメソッドのエラーでのみ動作するように見えますが、後で自動的に起こるものではありません。

Hibernate(Oracle 10)の場合とほとんど同じですが、自動コミット動作に似ています。

どのような考えですか?今日私はflush()を実行してエラーがプロセスメソッド内で発生し、rollbackForで捕捉されているかどうかを確認しますが、これを行う必要はありませんか? (それが動作する場合)

ありがとう

答えて

0

それを得ました。あなたはそれを見つけることができません「のTransactionManager」としてそれを持っていない場合、私はどこかで読んだ

<bean id="transactionManager_guardianship" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory_guardianship" /> 
    <property name="dataSource"><ref bean="dataSource_guardianship"/></property> 
</bean> 

:問題は、私は、トランザクション・マネージャの名前を変更すると思いました。意味がある(私は文脈のものを名前でも調べる!明らかである)。私は別のデータベースのために2つの異なるものを持っているので、私はこれをしました。

だから私は、修飾子を追加しました:

<bean id="transactionManager_guardianship" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory_guardianship" /> 
    <property name="dataSource"><ref bean="dataSource_guardianship"/></property> 
    <qualifier value="txGuardianship"/> 
</bean> 

...とサービス・クラスで正しいトランザクションと呼ば:

@Transactional(value="txGuardianship", propagation=Propagation.REQUIRED,readOnly=false,rollbackFor = Exception.class) 
public byte process(CommonDataBlock commonDataBlock) throws Exception { 

トランザクションマネージャ名が(変更、プラスとき、これがためであります理由は変わりました)私は2つを持っています。同様の@トランザクション(値=他のものの設定値)

いいえお返事

関連する問題