0

皆さん、私の目標は、使用中のデータベースに依存するプロパティを使用して EntityManager を作成することです。すべてのGoogle検索でこのようなことが行われているのを見てきました(この質問の目的のためにコードをより基本的にしました):

@PersistenceUnit
private EntityManagerFactory emf; 
private EntityManager em;
private Properties props;

@PostConstruct
public void createEntityManager(){

//if oracle set oracle properties else set postgres properties

emf = Persistence.createEntityManagerFactory("app-x");
em = emf.createEntityManager(props);
}

これは機能し、Oracle または Postgres のプロパティを正常にロードでき、いずれかのデータベースから選択できます。ただし、INSERT ステートメントを実行するときに問題が発生しています。INSERT が完了するたびに、重複した主キーの例外が発生します..毎回! なぜこれが起こっているのか、誰かが光を当てることができますか? ありがとう - ブラッド

4

2 に答える 2

1

コンテナ管理環境では、以下を直接注入できますEntityManager

EntityManager インスタンスを取得するには、エンティティ マネージャーをアプリケーション コンポーネントに挿入します。

@PersistenceContext
EntityManager em;

異なる永続化ユニット(および複数のインスタンス)を処理する必要がある場合はEntityManager、それらを で宣言し、その名前で注入されpersistence.xmlた権利を取得します。EntityManager

@PersistenceContext(unitName = "MyFirstPU")
EntityManager em;

更新: Specifying the Database (およびこのブログ投稿についても言及) によると、EclipseLink はデータベース プラットフォームを自動検出できる可能性があり、これeclipselink.target-databaseはオプションです。

デフォルトの持続性プロバイダーを使用している場合、プロバイダーは接続メタデータに基づいてデータベースの種類を自動的に検出しようとします。

これが Oracle と PostgreSQL で動作する場合 (そして、私の理解では動作するはずです)、顧客は IMO の理想的なシナリオであるデータソースをセットアップするだけで済みます。

于 2010-03-09T18:17:29.910 に答える
1

で注釈EntityManagerを付ける@PersistenceContext(unitName="app-x")

したがって、新しいエンティティ マネージャーとファクトリを作成する必要はありません。すべてがコンテナーによって自動的に処理されます。

于 2010-03-09T09:06:04.823 に答える