Hibernate EntityManager 未注入无状态 EJB
Hibernate EntityManager is not injected to Stateless EJB
我猜这被问了很多次,但我似乎无法正确回答。
我在 Webpshere 8.5.5.9 上部署了一个 WAR 应用程序,其中包含一些 EJB 组件,并尝试使用 JPA 2.0 和 Hibernate 4.2.0 来完成数据库工作。
这些 EJB 通过 JNDI 从其他应用程序调用以从数据库请求数据。
我为客户端生成了存根并且所有工作正常(好吧......几乎因为我不会 post 这个问题 :) :
客户端通过JNDI调用远程接口IDatabaseService,容器returnsDBServiceBean作为实现
@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 有一个 DAO 属性 注入为 EJB
@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
当我检查日志时,所有 类、绑定、休眠映射等都已创建,没有任何问题,但当我将日志消息放入其中时,我从未看到实体管理器 setter 被调用。
这是我的 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)
我阅读了有关此问题的主题,但不确定我没有满足什么要求
提前感谢您提供任何提示或指示。
抱歉,问题不在于实体管理器为空,而是 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" />
我猜这被问了很多次,但我似乎无法正确回答。 我在 Webpshere 8.5.5.9 上部署了一个 WAR 应用程序,其中包含一些 EJB 组件,并尝试使用 JPA 2.0 和 Hibernate 4.2.0 来完成数据库工作。 这些 EJB 通过 JNDI 从其他应用程序调用以从数据库请求数据。 我为客户端生成了存根并且所有工作正常(好吧......几乎因为我不会 post 这个问题 :) :
客户端通过JNDI调用远程接口IDatabaseService,容器returnsDBServiceBean作为实现
@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 有一个 DAO 属性 注入为 EJB
@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
当我检查日志时,所有 类、绑定、休眠映射等都已创建,没有任何问题,但当我将日志消息放入其中时,我从未看到实体管理器 setter 被调用。
这是我的 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) 我阅读了有关此问题的主题,但不确定我没有满足什么要求
提前感谢您提供任何提示或指示。
抱歉,问题不在于实体管理器为空,而是 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" />