2011-12-30 76 views
0

Spring宣言型トランザクションの基本をテストするための簡単なSpringアプリケーションを作成しました。 ルールごとに、宣言型トランザクションはRuntimeExceptionの場合にロールバックする必要があります。 しかし、それは私の場合には戻っていませんでした。Spring宣言型トランザクションがロールバックされない

@Transactional 
public class TrxHandleAnnotated 
public void doTask(){ 
ApplicationContext aplctx= new 
FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml"); 
JdbcTemplate jdbcTemplate= (JdbcTemplate)aplctx.getBean("jdbcTemplate"); 

jdbcTemplate.update("insert into kau_emp values(4,'forthmulga')"); 

throw new RuntimeException(); 
} 

し、必要な設定は設定XMLにあった - :

メインテストクラスは、コード

public class SpringOraTest { 
public static void main(String[] args) { 
    ApplicationContext aplctx= new  
FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml"); 

    //Call to test Declarative Transaction with Annotation 
TrxHandleAnnotated prxyobj=((TrxHandleAnnotated)aplctx.getBean("dbCommandAnnotated")); 
prxyobj.doTask(); 
} 
} 

クラスTrxHandleAnnotatedコードを持っていたされています。

例外がスローされたときにそのトランザクションがロールバックされることを期待していました。しかし、それはロールバックされず、記録はDBにコミットされていた。

インターネットでの長い検索の後でも、なぜそれがロールバックされていないのか理解できませんでした。

後でdoTask()コードで、私はコンテキストをもう一度作成し、JdbcTemplateインスタンスを新しいコンテキストから取り除いていることに気付きました。これが問題の根本的な原因でした。

コードを変更して、両方のクラスがいくつかのコンテキストを使用するようにしました。そして、それは働いた!

public class SpringOraTest { 
public static ApplicationContext aplctx; 
public static void main(String[] args) { 
    aplctx= new FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml"); 

    //Call to test Declarative Transaction with Annotation 
    TrxHandleAnnotated prxyobj=  
((TrxHandleAnnotated)aplctx.getBean("dbCommandAnnotated")); 
prxyobj.doTask(); 
} 

@Transactional 
public class TrxHandleAnnotated 
public void doTask(){ 

JdbcTemplate jdbcTemplate=(JdbcTemplate)SpringOraTest.aplctx.getBean("jdbcTemplate"); 
jdbcTemplate.update("insert into kau_emp values(4,'forthmulga')"); 

throw new RuntimeException(); 
} 

これは、特に必要な場合を除いて、アプリケーション全体で1つのコンテキストオブジェクトのみを使用する必要がある場合を除いて教訓です。

これはあまりにも明白な春の実践者が私のような春の初心者は愚かな間違いを行うことができます。だからそれを共有することを考えた。

JdbcTemplateを手動で作成する代わりに、この特定の場合は、メンバー変数として宣言してセッター注入を使用する方がよい場合があります。

+0

あなたの発見を共有するには、ブログを開く必要があります。 StackOverflowは質問をするためのものです。 –

答えて

-1

@TransactionConfiguration("name",ROLLBACK); //check syntaxを@Transactionalの後に、TrxHandleAnnotatedと宣言します。 @Transcationalとその使用法の詳細については、this linkを参照してください。

関連する問題