2012-09-05 38 views
0

我需要做類似於Injecting Entitymanager via XML and not annnotations中描述的東西,但我需要從XML注入真正的容器創建的實體管理器,以便它的行爲與存在一個真正的@PersistenceContext註釋。我找到了一個LocalEntityManagerFactoryBean(注意缺少「Container」字),但我擔心它會創建一個新的實體管理器工廠,因此實體管理器將不會與通過真正的@PersistenceContext註釋注入的實體管理器兼容。在Spring中從XML注入實體管理器

我將描述原因,因爲它很奇怪,也許我的問題的解決方案是選擇完全不同的方法。我在我的spring配置中使用PropertyPlaceholderConfigurer,在這個配置器中我引用了其他bean。我遇到的問題是自動裝配在這些引用的bean中不起作用。我不知道爲什麼以及PropertyPlaceholderConfigurer如何關閉那些引用的bean中的自動裝配,但事實是,如果我用這些bean的xml配置替換自動裝配,則一切正常。但是我無法取代EntityManager的自動裝配,因爲它不是標準的spring bean,但是jndi加載了一些我不完全理解的東西。

這樣或那樣,有沒有解決方法?

在彈簧bean.xml
+0

據我所知,由'SharedEntityManagerBean'從您提到的答案創建的EntityManager'的行爲與通過'@ PersistenceContext'注入的'EntityManager'完全相同。 – axtavt

+0

SharedEntityManagerBean需要注入entityManagerFactory,我不知道在那裏注入什麼。 –

回答

0
<bean id="earlyInitializedApplicationSettingsService" class="...services.impl.ApplicationSettingsServiceImpl" autowire-candidate="false"> 
    <property name="applicationSettingsDao"> 
     <bean class="....impl.ApplicationSettingsDaoImpl"> 
      <property name="entityManager"> 
       <bean class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
        <property name="entityManagerFactory"> 
         <bean class="org.springframework.jndi.JndiObjectFactoryBean"> 
          <property name="jndiName" value="java:comp/env/persistence/somePersistenceUnit"/> 
         </bean> 
        </property> 
       </bean> 
      </property> 
     </bean> 
    </property> 
</bean> 

通知主要是事實,我沒有使用標準的JEE:JNDI的查找,因爲它沒有工作(在創造了條件通過PropertyPlaceholderConfigurer),這是我的困惑的來源。當我使用直接JndiObjectFactoryBean時,它工作。

0

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="USER_TEST"/> 
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/> 
    </property> 
    <property name="jpaPropertyMap"> 
     <props> 
      <prop key="eclipselink.weaving">false</prop> 
     </props> 
    </property> 

<bean id="PersonDao" class="com.xxx.java.person.persistence.PersonDAO"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 
+0

這幾乎與我的問題中所描述的問題完全相同。這種方法的問題是LocalContainerEntityManagerFactoryBean完全獨立於容器中的AFAIK自定義JPA初始化。我需要具有與容器創建的相同的基礎結構。 –

+0

@ calavera.info:那麼,你有一個創建JPA基礎結構並希望使用它的容器,或者你想創建「與容器創建的基礎結構相同」? – axtavt

+0

第一個選項 - 我想使用由容器創建的JPA基礎結構。我只是不知道如何在XML中訪問它,通過@PersistenceContext注入不起作用。 –

相關問題