当前位置: 首页 > 面试题库 >

JTA EntityManager不能使用getTransaction()

穆商震
2023-03-14
问题内容

我的非ejb应用程序中如何包含以下代码。该代码有效。

@Override
public void saveItems(Collection<T> items) {
    synchronized (em) {
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            for (T item : items) {
                saveItem_((Class<T>) null, item);
            }
            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
        }
    }
}

在一个新的应用程序中,我正在使用EJB3 + JSF,并且想重用包含上面代码的库。我对新应用程序的持久性单元如下所示:

  <persistence-unit name="myApp" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>MySQLConnection</jta-data-source>
  </persistence-unit>

我的新应用程序在遇到此行时引发异常:

    EntityTransaction tx = em.getTransaction();

例外是:

A JTA EntityManager cannot use getTransaction()

这很清楚。问题是如何将代码转换为由容器管理的事务。大概需要对我的bean方法进行适当的注释…问题是如何?


问题答案:

EntityTransaction与资源类型为local的实体管理器一起使用。如果要使用JTA,则必须使用UserTransaction接口。

来自文档: EntityTransaction-
用于控制资源本地实体管理器上的事务的接口。EntityManager.getTransaction()方法返回EntityTransaction接口。

编辑: 添加了伪代码。

@Resource
private SessionContext sessionContext;

void execute(){

UserTransaction userTxn = sessionContext.getUserTransaction();

try{

 userTxn.begin();
 /**
  *  do-something
  */
 userTxn.commit();

  } catch(Throwable e){
   userTxn.rollback(); //-- Include this in try-catch 
  }
}


 类似资料:
  • 我现在的目标是创建一个网格,这将是我的游戏的基础。当玩家从菜单开始游戏时,这个网格应该出现在游戏场景上。稍后,我希望能够根据用户输入更改电路板的大小 1.在eventhandler中创建网格 我的推理是当玩家点击启动游戏的“SinglePlayer”按钮时创建网格。根据这个推理,我将简单地获取根节点(一个组)的子节点,并将gridpane添加到其中 为什么我被困住了 下面的代码段显示处理on bu

  • 如何在我的非 ejb 应用程序中使用以下代码。代码有效。 在一个新的应用程序中,我使用EJB3 JSF,并希望重用包含上述代码的库。我的新应用程序的死亡单元如下所示: 我的新应用程序在遇到此行时会引发异常: 例外情况是: 这是足够清楚的。问题是如何将代码转换为由容器管理事务。大概我的bean方法需要适当地注释……问题是如何注释?

  • 我有以下rest服务: 我能做错什么?如何使我的应用程序从json消费实体,而不是? 更新:实体类代码不包含任何有趣的内容,只有和两个带有一些jpa注释的字段。 Update2:完整StackTrace: update3:我没有找到任何解决方案,所以我通过使用s而不是JSON来替换method argument和。但无论如何都需要解决方案。

  • 我正在Windows 2012R2上运行MySQL 5.6.26,在MySQL.ini中,所有内容都配置为使用UTF-8 Unicode(utf8)。 当我执行以下SQL命令时: 数据库返回给我以下数据: 118威尼斯3 5 0 56

  • 我已经为spyder ide安装了anaconda。但我有很多问题。 runfile('C:/Users/Berk DOĞUŞ/Spyder Projects/DogrusalRegresyon.py',wdir='C:/Users/Berk DOĞUŞ/Spyder Projects')回溯(最后一次调用): 文件“”,第1行,在runfile中('C:/Users/Berk DOĞUŞ/Spy

  • 所以当我用 它关闭第一个窗口,调试自动停止,没有错误。没有例外。但当我用 NewFeed.ShowDialog(); 它打开第二个窗口,而不是关闭第一个窗口。 我想要的是关闭打开第一个窗口顶部的第二个窗口,然后关闭第一个窗口。