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

发布于 2024-12-09 18:01:35 字数 1157 浏览 0 评论 0原文

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

@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 中有以下 tran 管理器设置:

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

I have a Camel project and after we create a controll bean we want to clean up a DB log table. SO each time we run the application we TRUNCATE a table called agent orders. This is setup in an Enity object as a named query.

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

The code that calls this query looks like:

@Component("mgr")
public class Controller{ 

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

Call the clear history method we get an error javax.persistence.TransactionRequiredException: Executing an update/delete query

I have tried everything, UserTransaction, em.getTransaction().begin - nothing works. Any idea how I can run this query?

We have the following tran manager setup in our app 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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

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

希望这有帮助!

  • Try debugging and check whether your controller is proxied and whether there's transaction-related code executed before your method. Try enabling database server logs to check what queries really get executed.
  • Make sure you don't have any ServletFilters that set-up a read-only transaction prior to getting to your Controller.
  • Make sure your entity manager is the one that's passed to the transaction manager.
  • Also, I've found some info advising against using @PersistenceContext in servlets: http://weblogs.java.net/blog/ss141213/archive/2005/12/dont_use_persis.html

Hope this helps!

梦冥 2024-12-16 18:01:35

我会尝试使用 TransactionTemplate 执行查询,只是为了检查 @Transactional 注释是否确实有效。

另外,resultClass= AgentOrderEntity.class 是怎么回事?为什么截断表的查询需要返回一些东西?

I'd try executing the query with a TransactionTemplate just to check that the @Transactional annotation really isn't having an effect.

Also, what's up with resultClass= AgentOrderEntity.class? Why does a query that truncates a table need to return something?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文