2010-06-11 35 views
3

我有一个使用Hibernate作为JPA提供程序的JPA/Spring应用程序。在代码的一部分中,我必须使用新的运算符在应用程序中手动创建DAO,而不是使用Spring DI。当我这样做时,@PersistenceContext注释不会被Spring处理。在Spring上下文中创建JPA EntityMananger问题

在我的代码,我创建了DAO我有我用来设置的EntityManager如下EntityManagerFactory的:

@PersistenceUnit 
private EntityManagerFactory entityManagerFactory; 

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

的问题是,当我这样做,我得到一个Hibernate错误:

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

这里的春天实体管理器工厂配置:

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

+0

再次,问题和答案+1。 – 2010-06-11 20:06:51

回答

3

它与EntityManager无关。这是一个交易配置问题。显然org.hibernate.transaction.JTATransactionFactory强制JNDI查找。

切换到com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory和一切正常。