3

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

前もって感謝します

アデム

4

2 に答える 2

9

シーケンスを作成したときに、増分するサイズを指定しました。たとえば、このシーケンスは 1 ずつ増加します。

CREATE SEQUENCE supplier_seq
  MINVALUE 1
  MAXVALUE 999999999999999999999999999
  START WITH 1
  INCREMENT BY 1
  CACHE 20;

SequenceGeneratorJPA でアノテーションを使用する場合、割り当てサイズを指定できます。

@Id
@SequenceGenerator(name = "SEQ_RULES", sequenceName = "SEQUENZ_RULES",
    allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RULES")
@Column(name = "SERIALNO")
protected Long serialno;

JPA とシーケンス DDL の間で割り当てサイズとインクリメントが一致していることを確認してください。

于 2013-03-14T08:52:51.453 に答える