3

おはようございます。データベース スクリプト エグゼキュータを作成しようとしています。

Web アプリケーションが起動すると、利用可能なデータソース (JBoss AS7 に事前登録済み) のリストがユーザーに表示されます。

目的のデータソースを選択すると、アプリケーションはユーザーの選択に基づいて @PersistenceContext を使用します。

ここで見つけたデータソースを一覧表示する方法を示す答え: James R. Perkins - Answer

そして、ここで見つけた JNDI から EntityManagers を作成する方法を示す答え: Nayan Wadekar - Answer

私の質問はです。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 は、私が作成するどのコードよりもプールを適切に管理できると思います。

4

1 に答える 1

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 に答える