乔布斯内部的playframework手册jpa交易

时间:2013-01-17 17:17:58

标签: jpa transactions playframework

我看过this

我的问题是:

如果我想在Job中手动管理我的交易,我该怎么办?

现在我有一个代码并在那里使用“@NoTransaction”,如上文所述:

@NoTransaction
@Override
public JobResult doJobWithResult() throws Exception {

    ...  

    JobResult result = new JobResult();
     try {

        //MyEntity.em().getTransaction().commit();
        MyEntity.em().getTransaction().begin();
....

但是,在开始(begin())事务的那一刻,我仍然有一个错误:

  

java.lang.IllegalStateException:事务已处于活动状态

因此,即使我使用@NoTransaction,Job仍会启动自己的事务。

我可以这样解决:

   MyEntity.em().getTransaction().commit(); // commit previous started transaction
   MyEntity.em().getTransaction().begin();

但它似乎不是一个好的解决方案。

你会推荐什么?

1 个答案:

答案 0 :(得分:2)

我发现:如果使用:

  JPAPlugin.startTx(false); // to start transaction
  JPAPlugin.closeTx(false); // to close and commit transaction
  JPAPlugin.closeTx(true); //  to roll-back transaction 

而不是使用所有那些JPA的东西,然后一切正常。

所以,这对我来说是一个解决方案。但是我没有深入了解该剧如何发挥!认为/识别我是手动使用jpa还是通过插件api工作..然后决定。如果看一下startTx方法,它看起来像这样:

  if (autoTxs) {
        manager.getTransaction().begin();
    }
    JPA.createContext(manager, readonly);  

这个想法是“更好地使用'想要在Play中手动管理事务的JPA-Plugin方法(因为JPA插件涉及一些后端魔法,所以最好在你的行动中接近它)