Pregunta

Tengo una aplicación APP / primavera que utiliza Hibernate como el proveedor JPA. En una parte del código, tengo que crear manualmente un DAO en mi aplicación con el nuevo operador en lugar de usar un muelle DI. Cuando hago esto, la anotación @PersistenceContext no es procesada por la primavera.

En mi código donde creo el DAO Tengo una EntityManagerFactory que he usado para establecer el entityManager de la siguiente manera:

@PersistenceUnit
private EntityManagerFactory entityManagerFactory;

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

El problema es que cuando hago esto, me sale un error de Hibernate:

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

Aquí está la configuración del resorte gestor de la entidad de fábrica:

<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}" />

             

¿Fue útil?

Solución

No tiene nada que ver con el EntityManager. Es un problema de configuración de transacción. Al parecer, las fuerzas org.hibernate.transaction.JTATransactionFactory una búsqueda JNDI.

Al cambiar a com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory y todo funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top