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>