3

早上好,我正在尝试制作一个数据库脚本执行器。

当 Web 应用程序启动时,将向用户显示可用数据源的列表(在 JBoss AS7 中预先注册)。

选择所需的数据源后,应用程序将根据用户所做的选择使用@PersistenceContext。

说明如何列出我在这里找到的数据源的答案: James R. Perkins - Answer

以及如何从我在这里找到的 JNDI 创建 EntityManagers 的答案: Nayan Wadekar - Answer

我的问题是。可以从 JNDI 定义 @PersistenceContext 吗?如果我不使用声明的 JTA 数据源(“jta-data-source”),我的“persistence.xml”文件将如何?

目前它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="database" transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/DefaultDS</jta-data-source>
        <properties>
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

是否有任何教程或源代码示例可以解释此操作的工作原理?

注意:我想控制 JBoss AS 连接池,我不会安排它,我相信 JBoss 会比我创建的任何代码更好地管理池。

4

1 回答 1

1

如果您的所有数据源都使用不同的数据库模式连接到一个数据库,则有一个解决方案。在这种情况下,您可以创建一个数据源,在 persistence.xml 中定义它并基于此数据源动态创建 EntityManagerFactory,但用于另一种数据库方案:

private Map<String, EntityManagerFactory> entityManagers = Collections.synchronizedMap(new HashMap<String, EntityManagerFactory>());

public EntityManager getEntityManager(String databaseSchema) {
    EntityManagerFactory emf = entityManagers.get(databaseSchema.toUpperCase());
    if (emf == null) {
        emf = Persistence.createEntityManagerFactory("your_persistent_unit_name", createMap(databaseSchema));
        entityManagers.put(databaseSchema, emf);
    }
    return emf.createEntityManager();
}

public static java.util.Map createMap(String databaseSchema) {
    java.util.Map map = new HashMap();
    map.put("provider", "org.hibernate.ejb.HibernatePersistence");
    map.put("hibernate.cache.provider_class", "org.hibernate.cache.HashtableCacheProvider");
    map.put("hibernate.default_schema", databaseSchema.toUpperCase());
    map.put("hibernate.show_sql", "false");
    map.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
    map.put("hibernate.transaction.jta.platform", "org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform");
    map.put("hibernate.ejb.entitymanager_factory_name", databaseSchema+ "_entity_manager");
    return map;
}
于 2012-10-02T05:17:47.507 回答