如何在我的非 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方法需要适当地注释……问题是如何注释?
只是总结一下在Jboss EAP6和Hibernate上适用于我的代码4.2.18.Final.
可以为某人节省时间。
persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="myApp" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/MySQLConnection</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
<!--
<property name="hibernate.show_sql" value="true" />
-->
</properties>
</persistence-unit>
爪哇
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.transaction.UserTransaction;
public class MyClass {
@PersistenceContext(unitName = "myApp")
protected EntityManager em;
@Resource
UserTransaction utx;
public void execute(..) throws Exception {
try {
utx.begin();
em.remove(..);
em.merge(..);
em.persist(..);
utx.commit();
} catch (Exception ex) {
try {
utx.rollback();
} catch (Exception re) {
throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
}
throw ex;
}
}
}
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
<scope>provided</scope>
</dependency>
链接:
应用程序托管实体管理器 https://docs.oracle.com/cd/E19798-01/821-1841/bnbra/index.html
UserTransaction和EntityManager是如何交互的?
在最简单的情况下-它只是工作。如果您将EntityManager注入到EJB中,并且没有使用特殊注释,则事务将在输入的第一个EJB方法中打开(这意味着如果EjbA调用EjbB,而EjbB又调用EjbC,则所有EJB方法中只会使用一个事务)。如果要修改事务的控制方式,请查找@Transaction。
执行回滚的最简单方法是抛出一个标记为@ApplicationException的异常(rollback=true)
我可能错了,但从您的代码来看,您应该阅读EXTENDED和NORMAL EntityManager之间的区别。看起来您使用扩展em的方式非常尴尬(将循环移出事务将帮助您最终摆脱)。
小编辑:如果您尝试使用UserTransaction,正如另一篇文章所建议的,您会收到错误,因为标准EntityManager(您可能正在使用)使用所谓的CMT(容器管理事务)。不要碰它,除非您了解三个基本选项(如果您愿意,我可以详细说明,但坦率地说,您不需要它):
EntityTransaction
与resource 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(); 它打开第二个窗口,而不是关闭第一个窗口。 我想要的是关闭打开第一个窗口顶部的第二个窗口,然后关闭第一个窗口。