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

Jpa 调用utx.begin()抛出“时UserTransaction失败”;java.lang.IllegalStateException:不允许操作";,jpa,controller,ejb,eclipselink,stateless-session-bean,Jpa,Controller,Ejb,Eclipselink,Stateless Session Bean,我想使用ejb和jpa控制器,在netbeans中,控制器是自动生成的。。。我尝试从会话bean无状态的类(UniversidServiceEJB)调用jpa控制器,我调试了项目,成功创建了UserTransaction和EntityManagerFactory,但在jpa控制器(UniversityJpaController)中调用方法utx.begin时引发此异常: java.lang.IllegalStateException:不允许操作 位于com.sun.enterprise.tran

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

java.lang.IllegalStateException:不允许操作

位于com.sun.enterprise.transaction.UserTransactionImpl.checkUserTransactionMethodAccess(UserTransactionImpl.java:146) 位于com.sun.enterprise.transaction.UserTransactionImpl.begin(UserTransactionImpl.java:162) 在controller.universidajpaccontroller.create(universidajpaccontroller.java:47) 创建(UniversidadServiceEJB.java:40) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:601) 位于org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 位于org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) 位于com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388) 在com.sun.ejb.ejbInvokeBeanMethod(ejbInvokeBeanMethod.java:619)上 位于com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 在com.sun.ejb.ejbinavocation.procedure(ejbinavocation.java:571)上 位于org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:49) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:601) 位于com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) 位于com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 在com.sun.ejb.ejbinavocation.procedure(ejbinavocation.java:571)上 位于com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162) 位于com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 ... ...

会话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);
        } 

    } 

}
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();
            }
        }
    }
}
jpacontroller类是:

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

    } 

}
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();
            }
        }
    }
}
公共类universidajpacontroller实现可序列化{
公共大学djpacontroller(用户事务utx、EntityManagerFactory emf){
this.utx=utx;
this.emf=emf;
}
私有用户事务utx=null;
私有EntityManagerFactory emf=null;
公共实体管理器getEntityManager(){
返回emf.createEntityManager();
}
public void create(Universidad Universidad)抛出RollbackFailureException,Exception{
if(universidad.getEstudiantes()==null){
setEstudiantes大学(新ArrayList());
}
EntityManager em=null;
试一试{
utx.begin();
em=getEntityManager();
List attachedEstudiantes=new ArrayList();
for(Estudiante ESTUDIANTESSTUDIANTETO附件:universidad.getEstudiantes()){
ESTUDIANTESSTUDIANTETOAttach=em.getReference(ESTUDIANTESSTUDIANTETOAttach.getClass(),ESTUDIANTESSTUDIANTETOAttach.getId());
AttachedStudiantes.add(estudianteStudiantToAttach);
}
大学设置学生(附学生);
em.persist(大学);
for(Estudiante ESTUDIANTESSTUDIANTE:universidad.getEstudiantes()){
Universidad OldUniversidadoFestudiantesStudiante=estudiantesStudiante.getUniversidad();
大学教育学院(universidad);
ESTUDIANTESSTUDIANTE=em.merge(ESTUDIANTESSTUDIANTE);
如果(OldUniversidadoFestudiantesStudiante!=null){
OldUniversityADOFESTUDIANTESSTUDIANTE.getEstudiantes().remove(ESTUDIANTESSTUDIANTE);
OldUniversidadoFestudiantesStudiante=em.merge(OldUniversidadoFestudiantesStudiante);
}
}
提交();
}捕获(例外情况除外){
//试一试{
//utx.rollback();
//}catch(异常re){
//抛出新的RollbackFailureException(“尝试回滚事务时出错。”,re);
//            }
掷骰子;
}最后{
如果(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>

org.eclipse.persistence.jpa.PersistenceProvider
sqlServer
假的
请问有什么问题?。。
非常感谢…

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


参考:

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

但作为替代用途,您可以: @资源