JPA 2.0 EclipseLink の一意のチェック
-
27-09-2019 - |
質問
unique=true という列があります。試験クラスで....トランザクションが自動的にコミットされているため、コミットを強制するために私はem.commit()を使用することがわかりました。
ただし、一意であるかどうかを確認する方法を知りたいです。同時実行性により確認後の挿入になる可能性があるため、クエリを実行することは解決策ではありません。
一意性を確認する最良の方法はどれですか?
List<Exam_Normal> exam_normals = exam.getExam_Normal();
exam.setExam_Normal(null);
try {
em.persist(exam);
em.flush();
Long i = 0L;
if (exam_normals != null) {
for (Exam_Normal e_n : exam_normals) {
i++;
e_n.setItem(i);
e_n.setId(exam);
em.persist(e_n);
}
}
} catch (Exception e) {
System.out.print("sfalma--");
}
}
d
解決
残念ながら、JPAとの仕様は、ロールバックのためにトランザクションをマークするために、この例外を必要とするため、一意制約違反時にトランザクションのロールバックを回避するための方法はありません。あなたはJPA 2.0のAPIを使用して「ロック」コールを発行したときの行が存在しない可能性があるので、また、「ロック」のコールは、オブジェクトを挿入することができるだけでロックしているスレッドを保証しません。 A「ロック」を挿入エンティティの更新を防ぐことはなくなります。
あなたのコードを持っているとして「存続」が、可能な限り、トランザクションの開始の近くにそれを維持または操作は、独自のトランザクション内で発生していあなたが実行する必要があります。
もし、より大きなトランザクションの一部でなければならず、持続する障害は、あなたがこのトランザクションからエンティティインスタンスを格納する必要があり、あなたが「マージ」にできるようになり、後続のアプリケーションのこの部分を排除するものではない「存続」彼らロールバックからアプリケーションの回復すれば、後続のトランザクションにます。
他のヒント
ただし、一意であるかどうかを確認する方法を知りたいです。同時実行性のためにチェック後の挿入である可能性があるため、クエリを実行することは解決策ではありません。
JPA 2.0 では悲観的ロックが許可され、そのための 3 つのロック モードが追加されています。これは、ユースケースに応じたオプションになる可能性があります。
いくつかの参考文献:
カラムは主キーではないと仮定します(@Id
) この場合、アプリケーションは一意性を保証する必要があります。フィールドの一意性の保証はおそらく他の場所から得られる必要があります。フィールドの値のタイプは何ですか?ここにいくつかのアイデアがあります
カウンターの場合はおそらく使用できます @Singleton
ステートフル Bean (JavaEE 6.見る これ.
EE5 を使用している場合は、ステートレス Bean と @Entity
自動生成されたキーにマッピングされます。