Spring / Hibernate截断/删除表中的所有行 - 事务问题

时间:2011-10-15 12:17:15

标签: java hibernate spring jpa transactions

我有一个Camel项目,在我们创建一个控制bean之后,我们要清理一个DB日志表。因此,每次运行应用程序时,我们都会TRUNCATE一个名为代理订单的表。这是在Enity对象中设置为命名查询。

@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 - 一切正常。知道如何运行这个查询吗?

我们在app context.xml中设置了以下tran manager:

<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>

2 个答案:

答案 0 :(得分:1)

我尝试用TransactionTemplate执行查询只是为了检查@Transactional注释是否真的没有效果。

此外,resultClass= AgentOrderEntity.class有什么用?为什么截断表的查询需要返回一些东西?

答案 1 :(得分:1)

  • 尝试调试并检查您的控制器是否已被代理,以及在您的方法之前是否执行了与事务相关的代码。尝试启用数据库服务器日志以检查实际执行的查询。
  • 确保在访问Controller之前没有任何设置只读事务的ServletFilter。
  • 确保您的实体经理是传递给交易经理的实体经理。
  • 另外,我发现一些建议不要在servlet中使用@PersistenceContext:http://weblogs.java.net/blog/ss141213/archive/2005/12/dont_use_persis.html

希望这有帮助!