2010-02-22 18 views
17

Tengo una aplicación que usa servlets/JSP de Java. Hay varios clientes que usan mi aplicación, sin embargo, cada cliente tiene una base de datos separada. Todas las bases de datos tienen el mismo esquema. Me gustaría determinar qué conexión de base de datos usar en el momento en que un usuario inicia sesión en el sistema.¿Cómo me conecto a múltiples bases de datos usando JPA?

Por ejemplo, el cliente A inicia sesión, determino que el cliente A pertenece a la base de datos C, tomo la conexión para la base de datos C y continúo mi camino feliz.

Estoy usando JPA con Hibernate como mi proveedor de JPA. ¿Es posible hacer esto usando múltiples unidades de persistencia y determinando qué unidad usar en el momento del inicio de sesión? ¿Hay una forma mejor/preferida de hacer esto?

Editado para agregar: Estoy utilizando anotaciones y EJB para que el Contexto de persistencia se establezca en el EJB con @PersistenceContext (unitName = "blahblah"), ¿se puede determinar al momento de inicio de sesión? ¿Puedo cambiar UnitName en tiempo de ejecución?

Gracias

Respuesta

16

1) crear varias unidades persistentes en su persistence.xml con diferentes nombres.

2) Crear número necesario de EntityManagerFactory s (1 por persistence-unit) y especificar qué persistencia unidad se debe utilizar para la fábrica de hormigón:

<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="SpringSecurityManager"/> 
</bean> 

3) Crear número necesario de TransactionManager s:

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

4) En las clases de su DAO especificar con que la persistencia de unidades (y por lo tanto con el que EntityManagerFactory) que desea trabajar:

public class AbstractAuthDao<T> { 

    @PersistenceContext (unitName = "SpringSecurityManager") 
    protected EntityManager em; 

    ... 
} 

5) En sus servicios-objetos especificar qué TransactionManager se debe utilizar (esta función sólo se admite en la primavera 3,0):

@Transactional (value = "authTransactionManager", readOnly = true) 
public class UserServiceImpl implements UserService { 

    ... 
} 

6) Si tiene OpenEntityManagerInViewFilter en su web.xml, a continuación, especifique en su nombre de init-param de EntityManagerFactory necesaria (o crea varios filtros con bloques de inicialización correspondientes):

<init-param> 
    <param-name>entityManagerFactoryBeanName</param-name> 
    <param-value>authEntityManagerFactory</param-value> 
</init-param> 
+0

¿Quién dijo que el OP está utilizando Spring? :) –

+0

Hice esta sugerencia antes de que se editara la pregunta. – Roman

+0

Para ser justo, nunca mencioné a Spring en la publicación original, la edición simplemente agregó más información, pero esto me llevó a una respuesta que parece que va a funcionar, por lo que ha sido aceptada. – kgrad

Cuestiones relacionadas