web-dev-qa-db-ja.com

JPAを使用して最後に保持されたエンティティのIDを取得する方法

JPAを使用して永続化されたエンティティのIDを取得する、スマートで読みやすい方法を探しています。 idはIntegerです。

次の解決策が考えられます。

  1. GeneratedValue戦略を使用しません。これには、永続化する前にフリーIDを探し、それを永続化するエンティティに配置する必要があります:面倒ですが動作します。
  2. GeneratedValue戦略を使用します。永続化プロバイダーがID生成を処理します。これはよりスマートに見えますが、IDを取得する方法は?

ソリューション2については以下を参照してください

MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
System.out.println(en.getId());

これはnull IDを出力します!

助言がありますか? MyLink、EclipseLinkを使用していますが、ポータブルソリューションが必要です。

27
perissf

persistはIDの生成を保証しません。 IDは、フラッシュ時にのみ生成されることが保証されています。したがって、トランザクションが終了する前にIDが本当に必要な場合(そしてエンティティマネージャーがフラッシュされる場合)、明示的にflush()を呼び出してIDを取得します。

MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
em.flush();
System.out.println(en.getId());
53
JB Nizet