生成された代理キーの使用を開始した Eclipselink 2.4.0 を使用するアプリケーションがあります。私の EJB アノテーションは次のようになります。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "reformatFileId")
@SequenceGenerator(name = "reformatFileId", sequenceName = "REFORMAT_FILE_ID_SEQ", allocationSize = 1)
@Basic(optional = false)
@NotNull
@Column(name = "FILE_ID")
private Long fileId;
インスタンス化した後、EJB を永続化するための私のロジックは次のようになります。
try {
EntityManager em = getEntityManager();
em.persist(entity);
em.flush();
} catch (ConstraintViolationException ex) {
for (ConstraintViolation cv : ex.getConstraintViolations())
LOGGER.log(Level.SEVERE, "Constraint violation persisting {0}: {1}", new Object[]{entity.getClass(), cv.getMessage()});
throw ex;
}
オブジェクトを作成したら、すぐに fileId 値を取得する必要があります。これにより、fileId を外部キーとして使用する子テーブルにレコードを作成できます。ただし、fileId の値はまだ null です。
元のオブジェクトを破棄し、(fileId が代理キーである列の一意の組み合わせに基づいて) 新しいオブジェクトをクエリすることで、簡単な回避策を試しましたが、キャッシュされたオブジェクトを取得する必要があると思います。 m は、null fileId を持つ EJB インスタンスを引き続き取得します。
これがJPAのバグである場合に備えて、Eclipselink 2.4.1に更新しようとしましたが、それは役に立ちませんでした。
また、コミットロジックに em.refresh(entity) への呼び出しを追加しようとしましたが、更新は主キーに作用するため、問題は当然解決していません。
私は現在、このオブジェクトのキャッシュを無効にしてから再ロードすることを検討していますが、それはひどいクラッジのようです。JPAについて読んだことから、これは期待どおりに機能するはずです。
どんな提案でも大歓迎です。
スティーブ