2012-01-26 22 views
5

私は抽象クラスとそれを拡張する2つのサブクラスを持っています。私のJavaコードは、これは動作しませんspring @ Transactional annotation

ImportConfigFiles importConfigFiles = (ImportConfigFiles)context.getBean("importConfigFile"); 
importConfigFiles.setFileLocation(destPath); 
importConfigFiles.importDataToDB(); 

public void importDataToDB(){ 
    //all the good stuff goes in here 
} 

@Transactional 
public void executeInsertUpdateQuery(){ 
    //all the good stuff goes in here 
} 

私は

春の設定ファイルに次のように持っている私の抽象クラスで
<bean id="importConfigFile" class="xxx.ImportConfigFiles" parent="parentImportFile"></bean> 

<bean id="importFile" class="xxx.ImportUMTSKPIFiles" parent="parentImportFile"></bean> 

<bean id="parentImportFile" name="parentImportFile" class="xxx.ImportUMTSFiles" abstract="true"></bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

私は、次の方法があります。 executeInsertUpdateQuery()は、ネイティブSQLクエリを1回だけ実行します。私が@TransactionalをimortDataToDB()に置くと、それは動作しますが、そのメソッドの中で私はファイル内のすべての行をループし、レコードをdbに挿入するので、トランザクションが膨大になります。

答えて

8

これは春の主要な落とし穴の一つである - あなたは、同じクラスで非トランザクションメソッドから@Transactional -methodを呼び出す場合(あなたはAspectJの織りを使用しない限り)、@Transactionalは無視されます。これはSpringの問題ではありません - EJBにも同じ欠点があります。

残念ながらインターフェイスをベースとクラスベースのプロキシであなたができることすべてが二つにあなたのクラスを分割することです:

public class BeanA() { 

    @Resource 
    private BeanB b; 

    public void importDataToDB(){ 
     b.executeInsertUpdateQuery(); 
    } 
} 

public class BeanB { 

    @Transactional 
    public void executeInsertUpdateQuery(){ 
     //all the good stuff goes in here 
    } 

} 

全体ハッスルは春AOPプロキシの内部実装によって引き起こされます。上記のコードを使用すると、トランザクション以外のトランザクションBeanAからb.executeInsertUpdateQuery()を呼び出すたびに、新しいトランザクションが開始されます。

私のブログにはSpring pitfalls: proxyingSpring AOP riddleSpring AOP riddle demystifiedと書かれています。

+0

迅速な対応に感謝します。 – user373201

0

疑問がありますが、@Transactionalは1つのトランザクションでメソッド全体をラップするので、1つのメソッドですべてをインポートすると明らかに膨大になります。利点は、一部の場所でインポートが失敗した場合、トランザクション全体が実行されず、データベースに誤ったデータがないことです。

あなたがしたくない場合は、トランザクションを自分で管理するか、データのサブセットに対して@Transactional注釈付きのメソッドを呼び出す必要があります.1回のインポートで今行っているようですが、 10個のファイルまたはその他のファイル論理的な制限。

関連する問題