2010-06-01 17 views
11

Lo que intento hacer es inyectar a través de XML casi de la misma manera que lo hago a través de la anotación A @PersistenceContext. Lo necesito porque tengo diferentes administradores de entidades que necesito inyectar en el mismo DAO. Las bases de datos se reflejan entre sí y preferiría tener 1 clase base y para instancias de esa clase base, crear varias clases para poder usar la anotación @PersistenceContext.Inyectando Entitymanager a través de XML y no anotaciones

Aquí está mi ejemplo. Esto es lo que estoy haciendo ahora y funciona.

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 se definen a continuación ...

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

Lo que quiero hacer es crear clases NO ItemDaoImplStore2 o ItemDaoImplStore1. Quiero tener estos como instancias de ItemDaoImpl a través de xml en su lugar. Aunque no sé cómo inyectar el entitymanager correctamente. Quiero simular anotar esto como una anotación 'Repositorio', y también quiero poder especificar qué entityManager inyectar por el nombre de la unidad de persistencia. Quiero algo similar al siguiente utilizando XML en su lugar.

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

Respuesta

12

Uso SharedEntityManagerBean - Se crea una compartida EntityManager para EntityManagerFactory la misma manera que @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

le puede proporcionar la persistencia nombre de la unidad en la configuración XML, utilizando el SharedEntityManagerBean, como a continuación :

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

Por supuesto, usted puede tener la SharedEntityManagerBean como un bean separada

Aquí, yo estoy inyectando entityManager en BaseDAO como que está haciendo uso de @PersistenceContext(unitName="...")

Cuestiones relacionadas