0

这个问题被我问了很多次,但我似乎无法正确理解。 我在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作为示例) 我阅读了有关此问题的主题,但我不确定我没有遇到什么要求

非常感谢您提供任何提示或指示。

回答

0

我很抱歉,问题不在于实体管理器为null,而是em.createQuery()抛出了NullpointerException。

google搜索soome类似的问题后,我发现我的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" /> 
相关问题