これは私の最初の投稿ですので、ここのリソースは優れているので、私は本当に頭を傷つけているに違いありません。自動フラッシュ中の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で捕捉されているかどうかを確認しますが、これを行う必要はありませんか? (それが動作する場合)
ありがとう