sources mvc multiple example ejemplo datos data conexion con hibernate spring jpa entitymanager multiple-databases

hibernate - mvc - spring multiple data sources example



Spring+Hibernate+JPA+bases de datos mĂșltiples (2)

Tengo una aplicación Spring + Hibernate + JPA. El usuario, al iniciar sesión, puede elegir de una lista de DB para conectarse (estos son los requisitos). Todos los DB tienen el mismo esquema, por lo que se usarán las mismas entidades y los DAO.

En este momento tengo un EntityManager (he estado trabajando con una base de datos por el momento) que se inyecta en el DAO de esta manera:

@PersistenceContext private EntityManager entityManager;

¿Hay alguna manera de que el DAO reciba el entityManager automáticamente (administrado por Spring) en función de un parámetro / propiedad recibido de la capa de servicio? (La capa web envía un tipo de contexto, y el nombre / código / id de la base de datos elegida estará allí).

¿O debo gestionarlo yo mismo (crear todos los entityManagers, ponerlos en un mapa, decirle al DAO cuál de ellos usar para cada llamada)?

Hice algunas investigaciones antes de preguntar esto, pero los resultados no fueron concluyentes: la mayoría de las preguntas se referían a un modelo distribuido en 2 o más bases de datos y transacciones que abarcaban múltiples DB, pero este no es el caso para mí.

En mi caso, una vez que el usuario está conectado, es como si se conectara a una aplicación que solo tiene un administrador de entidades, el de la base de datos que seleccionó. No hay cambio entre la sesión intermedia de DB o cualquier otra cosa similar.

Gracias.


Esta característica se llama multi-tenancy.

Hibernate 4 debería EntityManager , aunque no estoy seguro de si se puede integrar con Spring-managed EntityManager .

Alternativamente, la forma más fácil de hacerlo es interceptar la creación de conexiones de bases de datos, ya sea a nivel de ConnectionProvider o en el nivel de DataSource , y elegir la base de datos adecuada basada en el identificador de inquilino almacenado en una variable ThreadLocal .

Ver también:


En primavera puede construir EntityManagerFactory dinámicamente con una configuración de Anotación (AnnotationWebConfiguration) usando algo como esto:

@Configuration public class MyAppConfig{ public LocalContainerEntityManagerFactoryBean getEmf(){ LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean (); Datasource ds = new .... ; // HERE!! you can create and configure your datasource to point to whatever you need emf.setName("system_pu"); emf.setDatasource(ds); emf.setPackagesToScan(""); //optional if no persistence.xml is defined return emf; } }