2011-06-01 26 views
1

Hallo全部: 我讀過關於這一點的spring參考。Spring @PersistenceContext如何在我的GenericDao中手動注入實體管理器

我會選擇在我的DAO中使用@PersistenceContext來注入一個共享的事務性實體管理器,但由於我在兩個指向2個不同持久性單元的entityManagerFactories上使用GenericDaoJpaImpl模式,因此我無法使用它。

所以,現在在我的應用我有這樣的配置:

entityManagerFactoryies:

<bean id="entityManagerFactoryIban0" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceXmlLocation" value="classpath:META-INF/contratto-persistence-iban0.xml" /> 
    </bean> 

    <bean id="entityManagerFactoryCont0" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceXmlLocation" value="classpath:META-INF/contratto-persistence-cont0.xml" /> 
    </bean> 

    <bean abstract="true" id="abstractDaoJpaImplIban0" lazy-init="false"> 
     <property name="entityManagerFactory" ref="entityManagerFactoryIban0" /> 
    </bean> 

    <bean abstract="true" id="abstractDaoJpaImplCont0" lazy-init="false"> 
     <property name="entityManagerFactory" ref="entityManagerFactoryCont0" /> 
    </bean> 

然後我的每一個的DAO的是GenericDaoImpl的一個實例:我構建

@Repository 
public class GenericDaoJpaImpl<T, ID extends Serializable> implements GenericDao<T, ID> { 
    private Class<T> entityClass; 

    private EntityManagerFactory entityManagerFactory; 

    public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) { 
     this.entityManagerFactory = entityManagerFactory; 
    } 

    public GenericDaoJpaImpl() { 
     super(); 
    } 

    public GenericDaoJpaImpl(Class<T> entityClass) { 
     super(); 
     this.entityClass = entityClass; 
    } 

    /** 
    * @see it.alten.intesasanpaolo.contratto.dao.common.GenericDao#getItemByID(java.io.Serializable) 
    */ 
    @Override 
    public T getItemByID(ID id) { 
     EntityManager em = entityManagerFactory.createEntityManager(); 
     return em.find(entityClass, id); 

    } 

我通過這種方式彈簧:

<bean id="eventMessageDao" parent="abstractDaoJpaImplCont0" class="it.alten.intesasanpaolo.contratto.dao.common.GenericDaoJpaImpl"> 
     <constructor-arg> 
      <value>it.alten.intesasanpaolo.contratto.domain.event.OnlineEventMessage</value> 
     </constructor-arg> 
    </bean> 

現在我想修改GenericDaoJpaImpl,如在spring文檔中所描述的那樣,不要關聯到entityManagerFactory,我不得不每次創建entityManager而直接關聯到entityManager。

我想以一種方式在上下文中定義它,我可以將它注入正確的抽象道,以便從每道道擴展。

<bean abstract="true" id="abstractDaoJpaImplIban0" lazy-init="false"> 
     <property name="entityManagerFactory" ref="entityManagerFactoryIban0" /> 
    </bean> 

我該如何做到這一點?

親切的問候 馬西莫

回答

4

您可以使用SharedEntityManagerBeanEntityManagerFactory構建事務EntityManager

<bean id="entityManagerFactoryIban0" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">    
    ... 
</bean> 

<bean id="entityManagerIban0" 
    class="org.springframework.orm.jpa.support.SharedEntityManagerBean">    
    <property name="entityManagerFactory" ref="entityManagerFactoryIban0" /> 
</bean> 

<bean abstract="true" id="abstractDaoJpaImplIban0" lazy-init="false"> 
    <property name="entityManager" ref="entityManagerIban0" /> 
</bean> 
0

您可以在XML配置文件提供持久性單元名稱,使用SharedEntityManagerBean,如下所示:

<bean id="testDao" class="com.test.persistence.dao.BaseDAO"> 
    <property name="entityManager"> 
     <bean class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
      <property name="persistenceUnitName" value="persistence-test-unit" /> 
     </bean> 
    </property> 
</bean> 
當然

,你可以有SharedEntityManagerBean作爲一個單獨的bean

在這裏,我米注射entityManagerBaseDAO爲你使用做@PersistenceContext(unitName="...")

相關問題