这个问题被我问了很多次,但我似乎无法正确理解。 我在Websphere 8.5.5.9上使用一些EJB组件部署WAR应用程序,并尝试使用JPA 2.0和Hibernate 4.2.0来执行数据库工作。 通过JNDI从其他应用程序调用这些EJB以从数据库请求数据。 我生成客户端存根和所有的作品(嗯...差不多,因为我不会发布问题:):Hibernate EntityManager没有注入到无状态EJB中
客户端通过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已经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有实体管理器。 一切工作正常,所有组件注入OK,但实体管理器注入不会发生,实体管理器在运行时为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必须注入另一个容器管理的对象(如JSF bean作为示例) 我阅读了有关此问题的主题,但我不确定我没有遇到什么要求
非常感谢您提供任何提示或指示。