当前位置: 首页 > 知识库问答 >
问题:

调用utx时UserTransaction失败。begin()抛出“java.lang.IllegalStateException:不允许操作”

柳奇希
2023-03-14

我想使用ejb和jpa控制器,在netbeans中,控制器是自动生成的。。。我尝试从会话bean无状态的类(UniversidadServiceEJB)调用jpa控制器,我调试了项目,成功创建了UserTransaction和EntityManagerFactory,但调用方法utx时。在jpa控制器(University jpa控制器)中开始引发以下异常:

JAVAlang.IllegalStateException:不允许操作。

com.sun.enterprise.transaction.UserTransactionImpl.checkUserTransactionFarodAccess(UserTransactionImpl.java:146)在com.sun.enterprise.transaction.UserTransactionImpl.begin(UserTransactionImpl.java:162)在控制器。UniversidadJpaController.create(UniversidadJpaController.java:47)在服务。UniversidadServiceEJB. create(UniversidadServiceEJB. java: 40)在sun.reflect.NativemetodAccessorImpl.invoke0(本机方法)在sun.reflect.NativemetodAccessorImpl.invoke(NativemetodAccessorImpl.java:57)在sun.reflect.在java.lang.reflect.Method.invoke(Method.java:601)在EJBSecurityManager. runmethod(EJBSecurityManager. java: 1052)在org. glassfish. ejb. security. Application. EJBSecurityManager. Invoke(EJBSecurityManager. java: 1124)在com. sun. ejb.容器. BaseContain. InvkeBeanAct(BaseContainer. java: 5388)在com. sun. ejb. EjbInvation. InvkeBeanAct(EjbInvation. java: 619)在com. sun. ejava委托方法AccessorInpl. invoke(委托方法AccessorInpl. java: 43)在java. lang. refect。方法。调用(方法。java: 601)在com. sun. ejb.容器。拦截器。在com. sun. ejb.容器。拦截器。aroundInvokeChainInvokeNext。AroundInvokeChainInvokeNext(InterceptorManager. java: 800)在com. sun. ejb。EjbInvocation。继续(EjbInvocation. java: 571)在com. sun。ejb。容器。拦截器。SystemInterceptorProxy. do周围(SystemInterceptorProxy. java: 162)在com. sun。ejb。容器。拦截器。SystemInterceptorProxy. aroundInvoke(SystemInterceptorProxy. java: 144)在sun。反射器。

会话Bean类是:

@Stateless(name="UniversidadJpa")
@Remote(IGestionUniversidad.class)
public class UniversidadServiceEJB {

    @Resource
    private UserTransaction utx;
    @PersistenceUnit(unitName="ApplicationEJBPU")
    EntityManagerFactory emf;


    public void create(Universidad universidad)  throws Exception {        
        try {
            UniversidadJpaController universidadController = new UniversidadJpaController(utx,emf);
            universidadController.create(universidad);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(UniversidadServiceEJB.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(UniversidadServiceEJB.class.getName()).log(Level.SEVERE, null, ex);
        } 

    } 

}

而jpacontroller类是:

public class UniversidadJpaController implements Serializable {

    public UniversidadJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Universidad universidad) throws RollbackFailureException, Exception {
        if (universidad.getEstudiantes() == null) {
            universidad.setEstudiantes(new ArrayList<Estudiante>());
        }
        EntityManager em = null;
        try {
            utx.begin();
            em = getEntityManager();
            List<Estudiante> attachedEstudiantes = new ArrayList<Estudiante>();
            for (Estudiante estudiantesEstudianteToAttach : universidad.getEstudiantes()) {
                estudiantesEstudianteToAttach = em.getReference(estudiantesEstudianteToAttach.getClass(), estudiantesEstudianteToAttach.getId());
                attachedEstudiantes.add(estudiantesEstudianteToAttach);
            }
            universidad.setEstudiantes(attachedEstudiantes);
            em.persist(universidad);
            for (Estudiante estudiantesEstudiante : universidad.getEstudiantes()) {
                Universidad oldUniversidadOfEstudiantesEstudiante = estudiantesEstudiante.getUniversidad();
                estudiantesEstudiante.setUniversidad(universidad);
                estudiantesEstudiante = em.merge(estudiantesEstudiante);
                if (oldUniversidadOfEstudiantesEstudiante != null) {
                    oldUniversidadOfEstudiantesEstudiante.getEstudiantes().remove(estudiantesEstudiante);
                    oldUniversidadOfEstudiantesEstudiante = em.merge(oldUniversidadOfEstudiantesEstudiante);
                }
            }
            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;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
}

持久化单元是:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
  <persistence-unit name="ApplicationEJBPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>sqlServer</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

请问有什么问题?...非常感谢...

共有2个答案

诸葛雨泽
2023-03-14

如上所述,在容器管理事务(CMT)下,如果使用API,您将获得getStatus()异常。

https://issues.jboss.org/browse/JBSEAM-456

但您也可以使用@Resource TransactionSynchronizationRegistry

如何判断Java EE 6拦截器中的事务是否处于活动状态?

顺便说一下-getState()api在glassfish上爆炸,但在weblogic 12.1.2上不会爆炸。Weblogic实际上应该在get状态api上抛出异常。

@Resource TransactionSynchronizationRegistry

这两种容器都适用。

宗政博文
2023-03-14

通常在EJB环境中,事务由容器管理。它在事务中包装Bean方法,并在异常发生时自动回滚。这也意味着不允许手动启动/提交/回滚事务,并抛出IllegalStateExctive。

参考:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Transaction3.html

 类似资料:
  • 嗨,我是java laungage一个有一个映射片段,如果我经常打开对话框并执行一些操作。我得到了 set_timerslack_ns写入失败:不允许操作 我已经尝试过这个解决方案,当运行地图活动时,应用程序崩溃,但问题是一样的。什么时候研发的,它显示在地图碎片上显示对话框导致了这个问题。有没有办法解决...?将标记添加到清单无法解决我的问题。

  • 我正在做一个Android Studio项目,有几个活动。我目前正在尝试读取localhost上的Java Servlet的输出,但它似乎由于套接字权限而崩溃。 我做了一个新的项目,使用了完全相同的代码,工作很完美。所以我不明白为什么不愿意在我的项目上工作。 我希望它读取数据,但它在这一行崩溃: 这是错误输出:

  • 问题内容: 我试图用javafxports编写一个简单的sqlite代码。 build.gradle: 我的JavaCode: 我用./gradlew launchIOSDevice发送它并得到以下错误: 有人可以帮我吗,如何在代码中提供权限,以便创建sqlite数据库? 谢谢 问题答案: 正如@ItachiUchiha指出的,您的问题与您尝试创建数据库的位置有关: 您提供的URL可能在您的桌面上

  • 我在OpenVZ服务器上创建LXC容器时遇到问题,当LXC尝试创建接口时,我收到下面的错误提示。我不确定OpenVZ是否允许这种配置,这是我第一次尝试。我一直在互联网上寻找解决方案,但我没有找到任何方法来解决我的问题。谢谢你的帮助。谢谢 root@websrv:~#lxc启动ubuntu: 18.04 ubuntu 创建ubuntu启动ubuntu错误:运行失败: /usr/lib/lxd/lxd

  • 问题内容: 我正在尝试在用户空间中使用mmap读取“ mem_map”开始的物理内存。它是一个包含所有物理页面的数组。这是一台运行3.0内核的i386计算机。 代码是这样的: 我以此为根。输出为: 可以肯定的是,我搜索了问题并将以下行添加到我的/etc/sysctl.conf文件中: 但这也不起作用。 谁知道为什么不允许这样的mem_map操作,以及如何解决呢? 谢谢。 问题答案: 听起来好像内核