【问题标题】:Hibernate EntityManager is not injected to Stateless EJBHibernate EntityManager 未注入到无状态 EJB
【发布时间】:2016-09-14 08:42:05
【问题描述】:

我猜这个问题被问了很多次,但我似乎无法正确回答。 我在 Webpshere 8.5.5.9 上部署了一个带有一些 EJB 组件的 WAR 应用程序,并尝试使用 JPA 2.0 和 Hibernate 4.2.0 来完成数据库工作。 这些 EJB 通过 JNDI 从其他应用程序调用以从数据库请求数据。 我为客户端生成了存根并且所有工作正常(嗯......几乎因为我不会发布问题:):

客户端通过JNDI调用远程接口IDatabaseService,容器返回DBServiceBean作为实现

@Stateless
@Remote({ IDatabaseService.class })
public class DBServiceBean implements IDatabaseService
{
    @EJB
    private ApplicationService applicationService;

    @Override
    public BOApplication getApplication(String applicationId)
    {
        BOApplication app = applicationService.getApplication(applicationId);
        return app;
    }

    // getters and setters
}

DBServiceBean 有一个作为 EJB 注入的服务

@Stateless
@LocalBean
public class ApplicationServiceImpl implements ApplicationService
{
    @EJB
    private ApplicationDao applicationDao;

    @Override
    public BOApplication getApplication(String applicationId)
    {
        DBApplication dbApplication = applicationDao.getApplication(applicationId);

        BOApplication application = new BOApplication(dbApplication);
        return application;
    }

    // getters and setters
}

ApplicationService 有一个作为 EJB 注入的 DAO 属性

@Stateless
@LocalBean
public class HBApplicationDao implements ApplicationDao
{
    @PersistenceContext(unitName = "some.jpa.name")
    private EntityManager em;

    @Override
    public DBApplication getApplication(String applicationId)
    {
        String sql = "....";
        Query query = em.createQuery(sql, DBApplication.class);
        query.setParameter("applicationid", applicationId);
        DBApplication application = (DBApplication) query.getSingleResult();

        return application;
    }

    public void setEm(EntityManager em)
    {
        this.em = em;
    }
}

DAO 拥有实体管理器。 一切正常,所有组件都注入正常,但实体管理器注入没有发生,并且实体管理器在运行时为 NULL

当我检查日志时,所有类、绑定、休眠映射等都毫无问题地创建,但是当我将日志消息放入其中时,我从未看到实体管理器设置器被调用。

这是我的 persistence.xml。

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
    version="2.0">
    <persistence-unit name="some.jpa.name" transaction-type="JTA">  
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/ExtensionDB</jta-data-source>
        <class>some.package.entity.DBApplication</class>
        <class>some.package.entity.DBApplicant</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="openjpa.TransactionMode" value="managed" />
            <property name="openjpa.ConnectionFactoryMode" value="managed" />
            <property name="openjpa.jdbc.DBDictionary" value="oracle" />
        </properties> 
    </persistence-unit>
</persistence>

我知道实体管理器不是在创建 bean 时注入的,而是在 bean 注入某处之后。此外,该 bean 必须注入另一个容器管理的对象(例如 JSF bean) 我阅读了有关此问题的主题,但我不确定我没有满足哪些要求

提前感谢您的任何提示或指示。

【问题讨论】:

    标签: hibernate jpa dependency-injection java-ee-6 hibernate-entitymanager


    【解决方案1】:

    对不起,问题不在于实体管理器为空,而是 em.createQuery() 抛出了 NullpointerException。

    在谷歌搜索了一些类似的问题后,我发现我的 persistence.xml 缺少所需的属性

    <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform" />
    

    添加属性后,一切正常。

    下面提到的这些属性也不是必需的(甚至可能会导致问题)。我没有研究他们的工作,但会检查他们。

    <property name="openjpa.TransactionMode" value="managed" />
    <property name="openjpa.ConnectionFactoryMode" value="managed" />
    <property name="openjpa.jdbc.DBDictionary" value="oracle" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 2023-03-31
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2016-01-30
      相关资源
      最近更新 更多