Проблема, создающая jpa entitymananer в весеннем контексте

StackOverflow https://stackoverflow.com/questions/3024466

Вопрос

У меня есть приложение JPA / Spring, которое использует Hibernate в качестве провайдера JPA. В одной части кода я должен вручную создать DAO в своем приложении с новым оператором, а не использовать пружину DI. Когда я делаю это, аннотация @persistenceCtext не обрабатывается весной.

В моем коде, где я создаю DAO, у меня есть EntityManagerFactory, который я использовал для того, чтобы установить EntiteManager следующим образом:

@PersistenceUnit
private EntityManagerFactory entityManagerFactory;

MyDAO dao = new MyDAOImpl();
dao.setEntityManager(entityManagerFactory.createEntityManager());

Проблема в том, что когда я делаю это, я получаю ошибку гибернации:

Could not find UserTransaction in JNDI [java:comp/UserTransaction]

Вот конфигурация фабрики Spring Entity Manager:

<bean id="myAppTestLocalEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myapp-core" />
    <property name="persistenceUnitPostProcessors">
        <bean class="com.myapp.core.persist.util.JtaPersistenceUnitPostProcessor">
            <property name="jtaDataSource" ref="myappPersistTestJdbcDataSource" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
            <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop>
        </props>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
            <!-- The following use the PropertyPlaceholderConfigurer but it doesn't work in Eclipse -->
            <property name="database" value="$DS{hibernate.database}" />
            <property name="databasePlatform" value="$DS{hibernate.dialect}" />

Это было полезно?

Решение

Это не имеет ничего общего с EntityManager. Это проблема конфигурации транзакции. Видимо org.hibernate.transaction.jtatransactionFactory заставляет поиск JNDI.

Переключился на com.atomikos.icatch.jta.hibernate3.atomikoSjtatransactionFactory и все работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top