【问题标题】:Dynamic Entity Manager in EJBEJB 中的动态实体管理器
【发布时间】:2013-01-26 17:37:01
【问题描述】:

我有一个使用 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 |
------------------------------------------

当皮埃尔认证时,主页调用一个ejb。这个 ejb 有一个实体管理器,它必须使用模式 database_schema1

连接到第 1 组数据库 localhost:3307

如果 Jacques 进行身份验证,它必须是第 2 组数据库。

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

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

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

【问题讨论】:

    标签: mysql glassfish ejb entitymanager


    【解决方案1】:

    您可以通过从 persistence.xml 中删除数据库 URL 并在运行时指定它来做到这一点:

    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 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2016-03-24
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多