2010-06-01 5 views
11

Was ich versuche zu tun, ist durch XML injizieren fast die gleiche Weise, die durch A @PersistenceContext Annotation getan wird. Ich brauche das aufgrund der Tatsache, dass ich verschiedene Entity Manager habe, die ich in dieselbe DAO injizieren muss. Die Datenbanken spiegeln sich gegenseitig und ich würde lieber 1 Basisklasse und für Instanzen dieser Basisklasse dann mehrere Klassen erstellen, nur so kann ich die @PersistenceContext Annotation verwenden.Injizieren von Entitymanager über XML und nicht Annotationen

Hier ist mein Beispiel. Das mache ich jetzt und es funktioniert.

public class ItemDaoImpl { 
protected EntityManager entityManager; 

public List<Item> getItems() { 
    Query query = entityManager.createQuery("select i from Item i"); 
    List<Item> s = (List<Item>)query.getResultList(); 
    return s; 
} 
public void setEntityManger(EntityManager entityManager) { 
    this.entityManager = entityManager; 
} 
} 

@Repository(value = "itemDaoStore2") 
public class ItemDaoImplStore2 extends ItemDaoImpl { 

@PersistenceContext(unitName = "persistence_unit_2") 
public void setEntityManger(EntityManager entityManager) { 
    this.entityManager = entityManager; 
} 
} 

@Repository(value = "itemDaoStore1") 
public class ItemDaoImplStore1 extends ItemDaoImpl { 

@PersistenceContext(unitName = "persistence_unit_1") 
public void setEntityManger(EntityManager entityManager) { 
    this.entityManager = entityManager; 
} 
} 

TransactionManagers, EntityManagers sind unten ...

definiert
<!-- Registers Spring's standard post-processors for annotation-based configuration like @Repository --> 
<context:annotation-config /> 

<!-- For @Transactional annotations --> 
<tx:annotation-driven transaction-manager="transactionManager1" /> 
<tx:annotation-driven transaction-manager="transactionManager2" /> 

<!-- This makes Spring perform @PersistenceContext/@PersitenceUnit injection: --> 
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

<!-- Drives transactions using local JPA APIs --> 
<bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager"> 
<property name="entityManagerFactory" ref="entityManagerFactory1" /> 
</bean> 

<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager"> 
<property name="entityManagerFactory" ref="entityManagerFactory2" /> 
</bean> 

<bean id="entityManagerFactory1" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="persistenceUnitName" value="persistence_unit_1"/> 
... 
</bean> 

<bean id="entityManagerFactory2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="persistenceUnitName" value="persistence_unit_2"/> 
... 
</bean> 

Was möchte ich nicht zu tun ist Klassen ItemDaoImplStore2 oder ItemDaoImplStore1 zu erstellen. Ich möchte diese als Instanzen von ItemDaoImpl über XML stattdessen haben. Ich weiß jedoch nicht, wie man den Entitymanager richtig einschleust. Ich möchte simulieren, dies als eine 'Repository' Annotation zu kommentieren, und ich möchte auch in der Lage sein zu spezifizieren, welcher entityManager durch den Namen der Persistenzeinheit injiziert werden soll. Ich möchte etwas ähnliches wie im Folgenden mit XML statt.

<!-- Somehow annotate this instance as a @Repository annotation --> 
<bean id="itemDaoStore1" class="ItemDaoImpl"> 
    <!-- Does not work since it is a LocalContainerEntityManagerFactoryBean--> 
    <!-- Also I would perfer to do it the same way PersistenceContext works 
    and only provide the persistence unit name. I would like to be 
    able to specify persistence_unit_1--> 
    <property name="entityManager" ref="entityManagerFactory1"/> 
</bean> 

    <!-- Somehow annotate this instance as a @Repository annotation --> 
<bean id="itemDaoStore2" class="ItemDaoImpl"> 
    <!-- Does not work since it is a LocalContainerEntityManagerFactoryBean--> 
    <!-- Also I would perfer to do it the same way PersistenceContext works 
    and only provide the persistence unit name. I would like to be 
    able to specify persistence_unit_2--> 
    <property name="entityManager" ref="entityManagerFactory2"/> 
</bean> 

Antwort

12

Verwendung SharedEntityManagerBean - es schafft eine gemeinsame EntityManager für EntityManagerFactory die gleiche Art und Weise wie @PersistenceContext:

<bean id="itemDaoStore1" class="ItemDaoImpl"> 
    <property name="entityManager"> 
     <bean class = "org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
      <property name = "entityManagerFactory" ref="entityManagerFactory1"/> 
     </bean> 
    </property> 
</bean> 
4

Sie die Konfiguration Persistenzeinheit Namen in der XML zur Verfügung stellen können, die SharedEntityManagerBean verwenden, wie unten :

<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> 

natürlich können Sie die SharedEntityManagerBean als separate Bohne haben

Hier, ich entityManager in BaseDAO m Injektion, wie Sie mit tun @PersistenceContext(unitName="...")

Verwandte Themen