0

生成された代理キーの使用を開始した 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について読んだことから、これは期待どおりに機能するはずです。

どんな提案でも大歓迎です。

スティーブ

4

2 に答える 2

0

TopLinkは、SEQUENCE生成のためにpersist()コールにid値を割り当てます。IDENTITY 生成の場合、フラッシュまたはコミットするまで割り当てることはできません。

永続呼び出しの後に値が表示されるはずです。エラーが発生していますか?@NotNull 検証制約があるため、エラーが発生する可能性があります。persist 呼び出しの後に id の値を出力してみてください。

于 2012-12-11T15:58:23.643 に答える