2011-10-15 52 views
0

我有一個Camel項目,在創建一個controll bean之後,我們要清理一個數據庫日誌表。所以每次我們運行應用程序時,我們都會截斷一個名爲代理訂單的表。這是作爲命名查詢在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 - 沒有什麼作品。任何想法如何我可以運行此查詢?

我們有以下TRAN管理器安裝在我們的應用程序的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
  • 嘗試調試並檢查您的控制器是否被代理以及在您的方法之前是否執行了與事務相關的代碼。嘗試啓用數據庫服務器日誌來檢查真正執行的查詢。
  • 確保您沒有任何設置只讀事務的ServletFilter進入控制器之前。
  • 確保您的實體管理器是傳遞給事務管理器的實體管理器。
  • 另外,我發現了一些信息對在Servlet中使用@PersistenceContext建議:http://weblogs.java.net/blog/ss141213/archive/2005/12/dont_use_persis.html

希望這有助於!

1

我想嘗試執行與TransactionTemplate查詢只是爲了檢查@Transactional註解還真是沒有效果。

另外,resultClass= AgentOrderEntity.class是怎麼回事?爲什麼截斷表的查詢需要返回一些內容?