【问题标题】:How to Use a dynamic @PersistenceContext with Hibernate and JBoss AS 7 Connection Pool如何在 Hibernate 和 JBoss AS 7 连接池中使用动态 @PersistenceContext
【发布时间】:2012-09-19 09:22:58
【问题描述】:

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

当 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 会比我创建的任何代码更好地管理池。

【问题讨论】:

    标签: hibernate persistence jboss7.x entitymanager


    【解决方案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;
    }
    

    【讨论】:

    • 您好感谢您的回复,在使用具有不同架构的同一数据库的情况下将非常有用。但是如果我使用不同的数据库,我可以实例化我的 persistenceUnit,并更改 jta-data-source 的值吗?或者,我可以在不使用 xml 的情况下在代码中创建一个 persistenceUnit?
    • Daniel,似乎没有办法仅在代码中执行此操作,但您可以尝试创建临时 *-ds.xml,如 link 中所述,并将该 xml 放到...不知道 JB7 到底在哪里,但伙计们在link 说“经过社区的多次抱怨,JBoss 实际上确实再次支持可部署的数据源(-ds.xml)”
    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多