kgr*_*rad 19 java hibernate jpa
我有一个使用Java servlets/JSP的应用程序.有多个客户端使用我的应用程序,但每个客户端都有一个单独的数据库.所有数据库都具有相同的架构.我想确定用户登录系统时要使用的数据库连接.
例如客户端A登录,我确定客户端A属于数据库C,获取数据库C的连接并继续我的快乐方式.
我使用JPA和Hibernate作为我的JPA提供者.是否可以使用多个持久性单元并确定在登录时使用哪个单元?有没有更好/首选的方法来做到这一点?
编辑添加:我正在使用注释和EJB,因此使用@PersistenceContext(unitName ="blahblah")在EJB中设置持久性上下文,这可以在登录时确定吗?我可以在运行时更改unitName吗?
谢谢
Rom*_*man 19
1)persistence.xml用不同的名称创建几个持久单元.
2)创建必要数量的EntityManagerFactorys(每个持久性单元1个)并指定应该为具体工厂使用哪个持久性单元:
<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="SpringSecurityManager"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
3)创建必要数量的TransactionManagers:
<bean id="authTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="authEntityManagerFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud)
4)在DAO的类中,指定要使用哪个持久性单元(以及使用哪个EntityManagerFactory):
public class AbstractAuthDao<T> {
@PersistenceContext (unitName = "SpringSecurityManager")
protected EntityManager em;
...
}
Run Code Online (Sandbox Code Playgroud)
5)在service-objects中指定应该使用哪个TransactionManager(仅在Spring 3.0中支持此功能):
@Transactional (value = "authTransactionManager", readOnly = true)
public class UserServiceImpl implements UserService {
...
}
Run Code Online (Sandbox Code Playgroud)
6)如果你OpenEntityManagerInViewFilter的web.xml中有,那么在其init-param名称中指定必要的EntityManagerFactory(或者用相应的init-blocks创建几个过滤器):
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>authEntityManagerFactory</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)