簡體   English   中英

如何在Hibernate和JBoss AS 7連接池中使用動態@PersistenceContext

[英]How to Use a dynamic @PersistenceContext with Hibernate and JBoss AS 7 Connection Pool

早上好,我正在嘗試創建一個數據庫腳本執行程序。

當Web應用程序啟動時,將向用戶顯示可用數據源列表(在JBoss AS7中預先注冊)。

選擇所需的數據源后,應用程序將根據用戶的選擇使用@PersistenceContext。

答案說明了如何列出我在這里找到的數據源: James R. Perkins - 答案

答案告訴我如何從我在這里找到的JNDI創建EntityManagers: Nayan Wadekar - 答案

我的問題是。 可以從JNDI定義@PersistenceContext嗎? 如果我不使用JTA DataSource(“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將比我創建的任何代碼更好地管理池。

如果所有數據源使用不同的數據庫模式連接到一個數據庫,則有一個解決方案。 在這種情況下,您可以創建一個數據源,在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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM