3

実行時に Web アプリケーションで既に使用されている EntityManagerFactory を再作成する方法はありますか? 私が望むのは、最後のデータベース接続を忘れて、webuser が他のデータベース (mysql スキーマ) を選択したときに実行時に新しいスキーマに接続するように entityManagerFactory に指示することです。または、すでに使用されているものを忘れずに、まだ使用されていない別の mysql スキーマへの新しい接続も使用します。これらのスキーマはまったく同じ構造 (テーブルなど) を持ちますが、セキュリティやその他の理由で異なるユーザー用です。これは可能ですか?

Vaadin フレームワーク、Eclipselink 2.4.1、Mysql 5.5、および Tomcat 7 を使用しています。状況に関連して見つけたものと、既に試したことは次のとおりです。私は Eclipselink 複合永続化ユニットを使用しています。2 番目のメンバーは常に同じです。たとえば、ユーザーが Web ページで 42 番目の候補を選択したときに、最初のスキーマを「42_candidate」に変更したいと考えています。 "。

private static EntityManager createEntityManagerForCandidateSchema(String candidateSchemaName) throws javax.persistence.PersistenceException {        

    System.out.println("createEntityManagerForCandidateSchema called");
    // set persistence unit properties
    HashMap<String,String> candidatePuProps = new HashMap<String,String>();
    candidatePuProps.put("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/"+candidateSchemaName+"?useUnicode=true&amp;characterEncoding=UTF-8");

    HashMap<String,Map> compositePuProps = new HashMap<String,Map>();
    compositePuProps.put("election_model_candidate", candidatePuProps);

    Map puProps = new HashMap();
    puProps.put("eclipselink.logging.level", "FINEST");
    puProps.put("eclipselink.composite-unit.properties", compositePuProps);
    // puProps.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, "com.beharbe.ui.ElectionSessionCustomizer");       

    boolean candidateDatabaseSchemaNotFound = false;
    try {
        EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("election_composite_pu",puProps);
        emf.close(); // to forget latest things
        emf = javax.persistence.Persistence.createEntityManagerFactory("election_composite_pu",puProps);            
        EntityManager em = emf.createEntityManager(compositePuProps);

...
public void selectionChanged(int newCandidatePersonId) {
    entityManager = Util.createEntityManagerForCandidateSchema(newCandidatePersonId);
    ...

(Eclipselink コンポジット PU) wiki.eclipse.org/EclipseLink/UserGuide/sandbox/gelernter/Composite_Persistence_Units#Persistence_Unit_Properties

(動的永続性) dev.eclipse.org/svnroot/rt/org.eclipse.persistence/branches/2.1/trunk/examples/jpa.employee/eclipselink.example.jpa.employee.dynamic/src/example/Main.java

(EclipseLink - 実行時にデータベース スキーマ名を構成する方法) www.rqna.net/qna/kxvmwy-jpa-eclipselink-how-to-configure-database-schema-name-at-runtime.html

(Eclipselink with Tomcat チュートリアル) wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#Session_Customizer

(Hibernate (Vaadin) で JPAContainer を使用) vaadin.com/book/-/page/jpacontainer.hibernate.html

(JPA アプリケーションを別のデータベースにアクセスさせるにはどうすればよいですか?) stackoverflow.com/questions/9315593/how-can-i-make-a-jpa-application-access-different-databases

(2 つ以上のデータベースを動的に接続する) stackoverflow.com/questions/9732750/connect-two-or-more-databases-dynamically?lq=1

(JPA - 複数のデータ ソースを使用してアクセス制御を定義する) www.rqna.net/qna/kqqihk-jpa-using-multiple-data-sources-to-define-access-control.html

JPA2 ランタイム データベース接続

JPA - EclipseLink - 実行時にデータベース スキーマ名を設定する方法 (Eclipselink SessionCustomizer)

たぶん、EclipseLink SessionCustomizer を使ってどうにかする必要がありますか? (最新のリンクを参照)

事前に助けてくれてありがとう


その間、私は何かを見つけました。これは私が使用しなければならないものです:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Auditing

私はこの方法を試していますが、EMFが最初に呼び出されたときに最初に接続されたスキーマにまだ接続しています:

....
candidatePuProps.put(PersistenceUnitProperties.JDBC_URL, "jdbc:mysql://localhost:3306/"+candidateSchemaName+"?useUnicode=true&amp;characterEncoding=UTF-8");
    candidatePuProps.put(PersistenceUnitProperties.EXCLUSIVE_CONNECTION_MODE, "Always");
    candidatePuProps.put(PersistenceUnitProperties.EXCLUSIVE_CONNECTION_IS_LAZY, "false");
...
4

1 に答える 1