Oracle DB テーブルにマップされたいくつかのエンティティを使用しています。ID 生成については、次のように注釈が付けられたシーケンス ジェネレーターを使用しています。
@Id
@SequenceGenerator(name = "SEQ_RULES", sequenceName = "SEQUENZ_RULES")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RULES")
@Column(name = "SERIALNO")
protected Long serialno;
プログラムの実行中に、エンティティから新しいインスタンスを作成し、この生成されたインスタンスを永続化したいと考えています。データベースの再起動後、JPA-EclipseLink を介して間違ったシーケンス番号を取得していますが、コンソールを介してデータベースに直接取得していません。
生成されたステートメントで使用されるバインディング パラメーターも取得するために、persistence.xml で次のプロパティをオンにしました。
<properties>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
</properties>
例: エンティティの新しいインスタンスを生成し、これを永続化する場合、serialNo に対して 2717 を取得し、実行すると
SELECT SEQUENZ_RULES.NEXTVAL FROM DUAL
nextval として 2767 を取得します。問題は、JPA で生成された serialNo が一意である必要があることです。現在、この serialNo を持つデータセットがまだいくつかあります。私は例外を取得しています:
java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (JASON.SYS_C0084866) violated
Non シーケンスの生成に影響を与える eclipse によるキャッシュはありますか、それともエラーの原因は何ですか?
使用コンポーネント:
GlassFish 3.1.1
EclipseLink 2.3.0.v20110604-r9504
データベース: Oracle バージョン: Oracle データベース 11g リリース 11.1.0.7.0 - 64 ビット
ドライバー: Oracle JDBC ドライバー バージョン: 11.2.0.1.0
前もって感謝します
アデム