java:/MySqlDS" />
您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Java >> 使用EntityManager的getTransaction获取事务时抛出IllegalStateException

使用EntityManager的getTransaction获取事务时抛出IllegalStateException

来源:网络整理     时间:2016/8/9 21:50:25     关键词:

关于网友提出的“ 使用EntityManager的getTransaction获取事务时抛出IllegalStateException”问题疑问,本网通过在网上对“ 使用EntityManager的getTransaction获取事务时抛出IllegalStateException”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 使用EntityManager的getTransaction获取事务时抛出IllegalStateException
描述:

我在一个SessionBean中使用动态注入获得了一个EntityManger。


@PersistenceContext
private EntityManager entityManager;

persistence.xml配置如下:


java:/MySqlDS





然后再一个Action中,获得SessionBean中的EntityManager对象后调用getTransaction方法获取一个事务,如:
this.sessionBean.getEntityManager().getTransaction();

本地的JUnit测试驱动中运行没有问题,但是一旦发布到JBoss服务器上运行就出错了。通过调试发现,问题正正出现在上述语句中,也就是getTransaction()方法,运行到该方法时抛出了IllegalStateException异常,异常信息如下:
引用
java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager
org.jboss.jpa.tx.TransactionScopedEntityManager.getTransaction(TransactionScopedEntityManager.java:231)
......(这里省略一堆堆栈信息)

请问各位,这个是什么原因导致的???应该如何解决这个问题
解决方案1:

因为你声明的是 JTA 事务,因此不能再使用 EntityTransaction 了。
需要使用 JTA 进行事务控制。
1:在 Session Bean 的类上加上 Bean 管理的事务声明:@TransactionManagement(TrahsactionManagerType.BEAN)
2:在 session bean 中加上 UserTransaction 一个成员变量,使用 @Resource 注入
@Resource
private UserTransaction ut;
或者先注入 EjbContext,再使用 EjbContext 中获得 UserTransaction 对象
@Resource
private EjbContext ejbContext;
3:使用 UserTransaction 的 begin(), commit(), rollback() 进行操作
需要注意的是:
1:@TransactionManagement(TrahsactionManagerType.BEAN) 一加,这个 bean 所有的事务都必须手工控制,这时这个 bean 称为 BMT,否则就是容器管理的事务 CMT
2:stateless session bean 自己管理的事务必须在一个方法内开始和结束,stateful session bean 可以在一个方法中开始,在另外一个方法中结束。


以上介绍了“ 使用EntityManager的getTransaction获取事务时抛出IllegalStateException”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3167109.html

相关图片

相关文章