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

实体管理器未注入无状态会话 Bean 中,@PersistenceContext

於子晋
2023-03-14

我一直在研究很多类似的问题,这些问题并没有反映我的确切问题。如果我忽略了有人已经解决了这个问题,请让我知道。

我目前正在Wildfly 10.1上将一个旧的EJB CMP bean迁移到JPA。这里的问题是我的无状态会话beans中的entitymanager没有注入@PersistenceContext,使EntityManager为空。我尝试使用EntityManagerFactory来解决这个问题。

随附的是来自服务器端的持久性.xml EJB2 会话 Bean 代码。

请帮帮忙。

public class CAAFAdminServiceBean implements SessionBean {
        @PersistenceContext(unitName = "PFJPAEMJTA")
            private EntityManager em1;
            // For some reason, em1 is not initialized by EJB container though this is Session bean, ideally it should be.
            // Hence calling getEntityManager() to create EntityManager from its Factory.
            private EntityManager em = null;

        public void ejbCreate() {
        em = getEntityManager();
        // Set same object in the Util class so that same can be referenced anywhere.
                CAAFEntityUtil.setEntityManager(em);
        }

        private EntityManager getEntityManager() {
                if (em1 == null) {
                    if (em == null) {
                        PerfLog perflog = new PerfLog(new PerfLogEJBCalledCategory(this.getClass(), "getEntityManager"));
                        String status = PerfLog.FAIL;
                        try {
                            EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PFJPAEMJTA");
                            em1 = em = entityManagerFactory.createEntityManager();
                            status = PerfLog.SUCCESS;
                            return em;
                        } finally {
                            perflog.end(status);
                        }
                    }
                    return em;
                }
                System.out.println("************EntityManager object is injected by EJB container, great to see that!!!************");
                return em1;
            }

        }


<?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="PFJPAEMJTA" transaction-type="JTA">
            <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
            <jta-data-source>java:jboss/jdbc/PF_TX_DATASOURCE</jta-data-source>
            <class>com.entity.rdbms.RDBMSComponentBean</class>   
            <properties>
                <property name="showSql" value="true"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
                <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
            </properties>
        </persistence-unit>
    </persistence>

共有1个答案

云宾鸿
2023-03-14

EJB 2会话bean不支持注入。考虑将其转换为“现代”EJB(假设它在现有ejb-jar.xml中被声明为Statless):

@Stateless
public class CAAFAdminServiceBean {

    @PersistenceContext(unitName = "PFJPAEMJTA")
    private EntityManager em;

    @PostConstruct
    public void formerEjbCreate() {
        CAAFEntityUtil.setEntityManager(em);
    }

    public void someBusinessMethod(MyEntity myEntity) {
        em.persist(myEntity);
        ...
    }

    ...
}

并删除 ejb-jar.xml 文件中的任何引用。

考虑删除CAAFEntityUtil,因为您应该能够在任何地方注入EntityManager,因为您也支持CDI。

 类似资料:
  • 我一直在研究很多类似的问题,这些问题并没有反映我的确切问题。如果我忽略了有人已经解决了这个问题,请让我知道。 我目前正在将JBoss 3.x上的旧EJB2.1应用程序迁移到JBoss 7.x上EJB3.x。由于应用程序客户端和服务器之间通信的变化,我创建了一个小的testclient来检查缺陷。 其中之一是我的无状态会话bean中的entitymanager没有被注入,使entitymanager

  • 我刚刚开始使用Spring ROO,并使用数据库逆向工程命令生成了我的实体类。然而每当我试图调用生成的实体类中的一个CRUD方法时,我总是得到这个异常:Java . lang . illegalstateexception:实体管理器没有被注入(Spring Aspects JAR是否被配置为AJC/AJDT方面库?) 我怀疑(通过查看生成的文件)EntityManager没有被注入到类中。你能告

  • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该

  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 问题内容: 我有一个有状态会话Bean(SFSB),它用作身份验证模块。在SFSB中,我存储了登录的当前用户。此外,我还有一些外观(用于处理我的实体的JPA / SQL内容)(无状态会话Bean(SLSB))。为了检查当前用户的访问权限,我尝试从SLSB中调用SFSB。但是,从SLSB调用时,当前用户字段始终为“空”。直接调用SFSB时,当前用户字段设置正确…对于调用,我使用@EJB批注。 任何想