0

было задано много раз, я думаю, но я просто не могу понять, как это правильно. У меня есть приложение WAR, развернутое в Webpshere 8.5.5.9 с некоторыми компонентами EJB и пытающееся использовать JPA 2.0 и Hibernate 4.2.0 для работы с базой данных. Эти EJB вызываются из других приложений через JNDI для запроса данных из базы данных. я сгенерировал заглушки для стороны клиента и все работает (ну ... почти так как я не вывесил бы вопрос :):Hibernate EntityManager не вводится в Stateless EJB

Клиент вызывает удаленный интерфейс IDatabaseService через JNDI и контейнер возвращает 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

@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-компонент должен быть введен в другой объект, управляемый контейнером (например, как JSF-компонент в качестве примера) Я читал темы по этой проблеме, но я не знаю, какое требование я не выполнял

Заранее благодарен за любые советы или указатели ,

ответ

0

Прошу прощения, проблема не в том, что диспетчер объектов был пустым, но em.createQuery() выбрал исключение NullpointerException.

После прибегая к помощи 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" />