実行時に 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&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
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&characterEncoding=UTF-8");
candidatePuProps.put(PersistenceUnitProperties.EXCLUSIVE_CONNECTION_MODE, "Always");
candidatePuProps.put(PersistenceUnitProperties.EXCLUSIVE_CONNECTION_IS_LAZY, "false");
...