2011-10-27 4 views
1

私は既存のシステムで作業しています。私のスプリングトランザクションマネージャーにスレッドにアタッチさせる必要があります。私は、トランザクションの注釈と考えることができると私はまだカントは、このエラーがクリアするために取得する注釈付きのすべてをアイブこの例外spawn offスレッドのスプリングトランザクション

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 
    at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) 
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687) 
    at parity.model.datamapping.RefreshTask.execute(RefreshTask.java:95) 
    at com.paritysys.tasks.ASyncTask$1.run(ASyncTask.java:48) 
    at java.lang.Thread.run(Thread.java:662) 

を得続けます。

私は私の方法

@TransactionAS400 
    @TransactionScores 
    public void refresh() { 
     ASyncTaskWorker worker = new ASyncTaskWorker() { 
      public void progress(double percentage, String message) { 
       logger.debug(String.format("%.2f - %s", percentage, message)); 
      } 

      public void handleException(Throwable e) { 
       try { 
        status.allowUpdating(property.getSchema()); 
       } catch (Exception b) { 
        // consume 
       } 

       logger.error("Failed to complete the refresh task", e); 
      } 

      public void done(boolean success) { 
       status.allowUpdating(property.getSchema()); 
       logger.debug(String.format(
         "Reset updating status to default for %s", 
         property.getSchema())); 
      } 
     }; 
     RefreshTask refTask = ServiceProviderContext.find(RefreshTask.class); 

     refTask.init(property, worker); 

     ASyncTaskHandler.getInstance().add(refTask); 
     ASyncTaskHandler.getInstance().process(); 
    } 
+0

トランザクションを開始するコードとそれを呼び出すコードを掲示してください。 – Ralph

+0

まあ、トランザクションを開始するコードはありません。トランザクションの注釈が私の春の豆の中で何をするのでしょうか。私の問題は、何らかの理由でBeanが新しいスレッドに生成されたときに、そのスレッドが新しいスレッドで新しいトランザクションを開始できることを認識していないことが原因です。 – scphantm

+1

私はあなたが '@ Transactional'を使うことを期待しました。しかし、この注釈付きメソッドを呼び出すコードを投稿してください。 – Ralph

答えて

2

を何をしないのです私は春の側面手の届かないところに糸を持って似たような状況に遭遇しました。 私がお勧めするには、次のものがある: 定義し、ワイヤーorg.springframework.transaction.support.TransactionTemplateのインスタンスをしてから使用してください。

transactionTemplate.execute(new TransactionCallback() { 
    @Override 
    public Object doInTransaction(TransactionStatus status) { 
     //your code 
    } 
} 

私は問題をデバッグするためtransactionTemplate.setName("myTransactionsName")事前に呼び出してお勧めします。

0

別の答えで提案されているようにTransactionTemplateが正常に動作しますが、注意すべき他の二つのオプションがあります:

1)は、(私はあなたが使用されている場合、これらの他の注釈はわからない@Transactionalような方法を定義します)<tx:annotation-driven>またはDefaultAdvisorAutoProxyCreator beanを宣言する

2)<tx:advice>とポイントカットを使用してトランザクションを定義します。

どちらもthe Spring manualに記載されています。