Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
328 views
in Technique[技术] by (71.8m points)

java - How do I connect to multiple databases using JPA?

I have an application using Java servlets/JSP's. There are multiple clients using my app, however each client has a separate database. All the databases have the same schema. I would like to determine which database connection to use at the time when a user logs into the system.

For example client A logs in, I determine that client A belongs to database C, grab the connection for database C and continue on my merry way.

I am using JPA with Hibernate as my JPA provider. Is it possible to do this using multiple persistence units and determining which unit to use at login time? Is there a better/preferred way to do this?

Edited to add: I am using annotations and EJB's so the Persistence Context is being set in the EJB with @PersistenceContext(unitName = "blahblah"), can this be determined at login time? Can I change the unitName at runtime?

Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

1) Create several persistent units in your persistence.xml with different names.

2) Create necessary number of EntityManagerFactorys (1 per persistence-unit) and specify which persistence-unit should be used for concrete factory:

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

3) Create necessary number of TransactionManager s:

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

4) In your DAO's classes specify with which persistence-unit (and so with which EntityManagerFactory) you want to work:

public class AbstractAuthDao<T> { 

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

    ...
}

5) In your service-objects specify which TransactionManager should be used (this feature is supported only in Spring 3.0):

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

   ...
}

6) If you have OpenEntityManagerInViewFilter in your web.xml, then specify in its init-param name of necessary EntityManagerFactory (or create several filters with correspondent init-blocks):

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...