2011-12-06 5 views
1

ログインセッションに応じてJavaEE6プロジェクト(JBoss7)のEntityManagerを選択する必要があります。 ユーザー "Peter"はdbPeterを使用し、ユーザーPaulはデータベースdbPaulを使用します。JavaEE6:ログイン情報でエンティティマネージャの永続ユニットを選択する方法

問題は今、どのようにして自動的にデータベース/永続性ユニットにバインドされるエンティティマネージャを生成できますか?

CDIを使用してEntityManagerを挿入します。だから私の最初のステップは、セッションからログイン情報を探してデータベースを選択するEntityManager用のプロデューサを持つことです。 それでは、このprducerでデータベース/永続コンテキストを選択するにはどうすればいいですか? Jboss7では永続ユニットのjndiエントリが見えなくなるため、jndiルックアップは考慮されません。

私は

@Produces 
public EntityManager produceEM() { 
    EntityManagerFactory managerFactory = Persistence.createEntityManagerFactory("dbPaul"); 

    return managerFactory.createEntityManager(); 
} 

を使用してみましたが、これは

HHH000231で展開中失敗:スキーマのエクスポートの失敗:ます。java.sql.SQLException:あなたが管理するトランザクション中に自動コミットを設定することはできませんが!

emが注入された場所がほとんどトランザクション内ですので問題ありません。 アイデアは誰ですか?

答えて

2

まず、EntityManagerFactoryをオンザフライで作成することには消極的です。私はあなたがすべての単一のDAOインスタンスの作成(またはあなたのデータベースにアクセスするために使用している任意のEJBオブジェクト)でそれをしなければならないと思います。その場合は、2度考えてください:EntityManagerFactoryを作成するのは非常に高価で、通常はアプリのライフサイクルで1回行う必要があります。代わりに、おそらくEntityManagerを作成するためにコンテナに依拠できるように、各パーシスタンスユニットに対して異なるDAOを作成して、どちらか一方を上位レイヤに使用する責任を移します。

、あなたのコンテキストで、メソッドproduceEMは()EJBであり、あなたは、コンテナ管理セキュリティを使用していると仮定して、あなたが経由EJBContextの注入できる言われていること:ここからあなたが得ることができる

@Resource 
EJBContext ejbContext; 

Principalとそれに応じてEntityManagerを作成します。

仮定のいずれかが有効でない場合は、私に知らせてください、私の答えを更新しようとします。

EDITED:

@Stateless 
public class EntityManagerService { 

    @Resource 
    EJBContext ejbContext; 

    @Produces 
    public EntityManager produceEM() { 

    EntityManagerFactory managerFactory = Persistence.createEntityManagerFactory(ejbContext.getCallerPrincipal().getName()); 

    return managerFactory.createEntityManager(); 

    } 
} 

また、ユーザー名とあなたがそれらの間にいくつかのデカップリングをしたい場合は、おそらく良いアイデアですデシベル名の間に独自のマッピングを作成することができます。

+0

まあ、EntityManagerFactoryに関しては正しいです。 私のケースでは、運用環境でどれくらいの持続ユニットが存在するのか分かりません。私たちには、各クライアント用のデータベースがありますが、展開されたWebアプリケーションは1つだけです。クライアントの数が増え、新しいクライアントごとにDAOが作成されないことは非常に確実です。私が必要とするのは、EntityManagerを永続ユニットにバインドする一般的な方法です。プリンシパル情報が使用する永続ユニットを指しています。 – martin

+0

私はそれに応じて私の答えを編集 –

+0

これは私のSQLExceptionの問題を解決していません。 "java.sql.SQLException:管理されたトランザクション中に自動コミットを設定できません!" – martin

0

あなたの質問に対する答えは正確ではありませんが、JPAマルチテナントとは考えていますか? AFAIKは、HibernateとEclipseLinkの両方でサポートしています。

+0

ヒントはありがとうございますが、それは逆です。=)各顧客のデータベースが必要です。それは私の上司がそれを望む方法それは – martin

+0

ここにこの男は、あなたがHibernateで望むことをする方法を示しています:http://relation.to/Bloggers/MultitenancyInHibernate。基本的には、db代入を考慮したConnectioProviderです。できるだけ早くテナントIDを設定する必要があります。また、クロススレッドやクロスVMコールをすると問題が発生する可能性があります。 –

関連する問題