En la primavera, ¿cómo uso un classpathxmlaPlaPicationContext para obtener un EntityManager?
-
19-09-2019 - |
Pregunta
Con Spring puedo autowire un bean con la siguiente propiedad:
@PersistenceContext(unitName="foo") private EntityManager em;
Usando lo siguiente, puedo obtener el bean "SomeBean": Manualmente:
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
AutowireCapableBeanFactory fac = ctx.getAutowireCapableBeanFactory();
fac.autowireBean(someBean);
Sin embargo, no puedo entender cómo obtener directamente un EntityManager en particular. El caso de uso es que quiero escribir una prueba que obtenga todos los objetos EntityManager y ejecute consultas simples en ellos para asegurarse de que estén configurados correctamente. Para hacer esto, necesito poder obtener todos los objetos EntityManager del contexto de la aplicación. ¿Cómo puedo hacer eso?
Lo siguiente no funciona. Devuelve un mapa vacío.
Map<String,EntityManager> ems = ctx.getBeansOfType(EntityManager.class);
Solución
Intenta llamar
EntitiyManagerFactory factory =
(EntityManagerFactory) ctx.getBean("myEntityManagerFactoryBean")
EntityManager em = factory.createEntityManager();
donde "myentityManagerFactorBean" es tu LocalContainerEntityManagerFactoryBean
Pero, ¿por qué necesitarías eso?
Otros consejos
Yo uso el springjunit4classrunner
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:jndiContext-mock.xml",
"classpath:spring/testContext.xml" })
El clase bajo prueba se inyecta a través del contexto simulado. Con esto anotado, obtendrá el gerente de entidad mediante inyección.
@PersistenceContext
protected HibernateEntityManager entityManager;