質問

みなさん、私の目標は、使用中のデータベースに応じたプロパティを使用して 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 が完了するたびに、重複主キー例外が発生します。毎回!なぜこれが起こっているのかを誰かが解明できますか?ありがとう -ブラッド

役に立ちましたか?

解決

コンテナ管理 環境では、 EntityManager:

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

@PersistenceContext
EntityManager em;

別のことに対処する必要がある場合 永続化ユニット (したがって、いくつかの EntityManager インスタンス)、それらを persistence.xml そして権利を得る EntityManager その名前によって注入されます:

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

アップデート: によると データベースの指定 (そしてこれについても触れました ブログ投稿)、EclipseLinkはデータベース・プラットフォームと eclipselink.target-database はオプションです:

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

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

他のヒント

EntityManager にして、あなたの@PersistenceContext(unitName="app-x")に注釈を付けます

このように、あなたは新しいエンティティマネージャや工場を作成する必要はありません - すべてが自動的にコンテナによって処理されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top