Java joinTransaction已在JBoss中的资源本地EntityManager上调用

Java joinTransaction已在JBoss中的资源本地EntityManager上调用,java,jakarta-ee,jpa,jboss,jta,Java,Jakarta Ee,Jpa,Jboss,Jta,我以前使用过应用程序管理的资源本地事务,但现在我想使用容器管理的JTA事务。当我使用@Stateless时,一切似乎都正常,但当我使用@Stateful时,我得到一个异常,如下所示 javax.ejb.EJBException: javax.persistence.TransactionRequiredException: joinTransaction has been called on a resource-local EntityManager which is unable to re

我以前使用过应用程序管理的资源本地事务,但现在我想使用容器管理的JTA事务。当我使用@Stateless时,一切似乎都正常,但当我使用@Stateful时,我得到一个异常,如下所示

javax.ejb.EJBException: javax.persistence.TransactionRequiredException: joinTransaction has been called on a resource-local EntityManager which is unable to register for a JTA transaction.
我正在使用JBoss eap 6.2、EclipseLink 2.5、Java8和Oracle

@Stateful
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class LoginDetailService {

    @PersistenceContext(unitName="OracleDB", type=PersistenceContextType.EXTENDED)
    protected EntityManager em;

    public void addLoginDetails(String email, String pwd){
        LoginDetail ld = new LoginDetail(email,pwd);
        em.persist(ld);
    }

    @Remove
    public void finished(){}
}
我的Servlet代码

@WebServlet("/signup")
public class SignUpServlet extends HttpServlet {
    @EJB LoginDetailService bean;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String email = "EMAIL",
               pwd = "PASSWORD";
        bean.addLoginDetails(email, pwd);  //exception occurs here
        response.getWriter().println("Successful");
    }
}
还有我的persistence.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="OracleDB" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>java:jboss/jdbc/OracleDB</jta-data-source>
        <class>com.entity.Student</class>
        <class>com.entity.LoginDetail</class>
        <properties>
            <property name="eclipselink.logging.level" value="FINEST"/>
        </properties>
    </persistence-unit>
</persistence>

org.eclipse.persistence.jpa.PersistenceProvider
java:jboss/jdbc/OracleDB
com.entity.Student
com.entity.LoginDetail

请告诉我哪里出了问题。谢谢

经过大量工作,我终于发现了问题。实际上我的代码没有问题,这是因为JBoss服务器。我用Glassfish4测试了相同的应用程序,它工作得非常好。
原因
注释@EJB在JBoss中没有作用。虽然您将看到该bean已发生JNDI绑定,但当您尝试tp PERSISTER时,它将无法工作。
解决方案

  • 要使它在JBoss而不是@EJB上工作,您必须进行JNDI查找并执行事务。但由于某种原因,在我的桌面上查找失败,但在笔记本电脑上运行良好,这可能是由于某些奇怪的服务器配置
  • 我觉得另一个更好的解决方案是使用另一个服务器,如Glassfish或WebLogic,其中@EJB工作良好,不需要任何额外的编码