1

我有一个使用 Spring MVC 和 Spring Security 的应用程序。

应用程序项目有 ejbs 和 web 应用程序。

我有一个用户通用数据库和一个用户组数据库。

因此,当用户进行身份验证时,Spring Security 使用公共数据库来检查登录名/密码,并且当控制器调用 ejb 时,实体管理器连接到用户的组数据库。

我的目标是:即时创建用户/组及其关联的数据库。

例子 :

公共数据库localhost:3306 database_schema1包含

  USERS
----------------------
| NAME    | GROUP_ID |
----------------------
| Pierre  |        1 |
| Paul    |        1 |
| Jacques |        2 |
----------------------

  GROUPS
------------------------------------------
| ID | URL            | SCHEMA_NAME      |
------------------------------------------
|  1 | localhost:3307 | database_schema1 |
|  2 | localhost:3308 | database_schema1 |
------------------------------------------

当 Pierre 进行身份验证时,主页会调用一个 ejb。这个 ejb 有一个实体管理器,它必须使用模式database_schema1连接到组 1 数据库localhost:3307

如果 Jacques 验证,它必须是组 2 数据库。

我该如何告诉实体经理使用我在构建项目时不知道的给定数据库?

我的意思是,我不想在我的 ejb 中使用 persistence.xml,而是根据经过身份验证的用户动态初始化实体管理器。

Persistence.createEntityManagerFactory() 会在这种情况下工作吗?如果是这样,这是最好的解决方案吗?

4

1 回答 1

0

您可以通过从中删除数据库 URLpersistence.xml并在运行时指定它来执行此操作:

Map<String, String> params = new HashMap<String, String>();
// put the correct URL here
// you can also specify any other parameter from 'persistence.xml'
String dbUrl = "jdbc:mysql://localhost:3308/database_schema1"; 
params.put("javax.persistence.jdbc.url", dbUrl);
EntityManagerFactory factory = 
  Persistence.createEntityManagerFactory("...", params);

然后,根据需要使用此factory对象创建EntityManager实例。

于 2013-02-11T19:18:39.077 回答