2011-10-15 13 views
0

私はCamelプロジェクトを持っています.Control Beanを作成した後、DBログテーブルをクリーンアップします。私たちがアプリケーションを実行するたびに、エージェント注文と呼ばれるテーブルをTRUNCATEします。これは、名前付きクエリとしてEnityオブジェクトに設定されます。Spring/Hibernateテーブルからすべての行を切り捨てる/削除する - トランザクションの問題

@NamedNativeQuery(name="cleanOrderTable", query="TRUNCATE agent_orders",resultClass= AgentOrderEntity.class) 

このクエリを呼び出すコードのようになります。

@Component("mgr") 
public class Controller{ 

    @PersistenceContext(unitName="camel") 
    private EntityManager em; 
    ....... 
    @Transactional 
    public void clearHistoricalOrders() throws Exception{ 
     Query query = em.createNamedQuery("cleanOrderTable"); 
     query.executeUpdate(); 
    } 
} 

は、私たちがエラーにjavax.persistence.TransactionRequiredException: Executing an update/delete query

を取得履歴のクリアメソッドを呼び出して、私はすべて、UserTransactionem.getTransaction().beginを試してみました - 何も機能しません。どのように私はこのクエリを実行することができますか?

私たちは、アプリのcontext.xmlに以下のトランマネージャを設定している:

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

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
     p:dataSource-ref="dataSource"> 
     <property name="entityManagerFactory" ref="emFactory" /> 
</bean> 

答えて

1
  • デバッグを試して、コントローラがプロキシされているかどうか、お使いのメソッドの前にトランザクション関連のコードが実行されているかどうかを確認してください。実際に実行されるクエリを確認するには、データベースサーバーログを有効にしてください。
  • コントローラにアクセスする前に読み取り専用トランザクションを設定するサーブレットフィルタがないことを確認してください。
  • エンティティマネージャがトランザクションマネージャに渡されていることを確認してください。
  • はまた、私はサーブレットに@PersistenceContext使用に対して助言するいくつかの情報を見つけた:http://weblogs.java.net/blog/ss141213/archive/2005/12/dont_use_persis.html

ホープ、このことができます!

1

私はTransactionTemplateでクエリを実行するだけで@Transactional注釈が本当に効果を持っていないことを確認するために試してみました。

また、resultClass= AgentOrderEntity.classとは何ですか?テーブルを切り捨てるクエリが何かを返す必要があるのはなぜですか?

関連する問題