EntityManagerFactory の使用により重複主キー例外が発生する
-
18-09-2019 - |
質問
みなさん、私の目標は、使用中のデータベースに応じたプロパティを使用して 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")
に注釈を付けます
このように、あなたは新しいエンティティマネージャや工場を作成する必要はありません - すべてが自動的にコンテナによって処理されます。
。