gpt4 book ai didi

java - JTA EntityManager 不能使用 getTransaction()

转载 作者:IT老高 更新时间:2023-10-28 20:47:17 31 4
gpt4 key购买 nike

如何在我的非 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();

异常(exception)是:

A JTA EntityManager cannot use getTransaction()

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

最佳答案

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

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


编辑:添加伪代码。

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

关于java - JTA EntityManager 不能使用 getTransaction(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964717/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com