JPA Eclipselink получает неправильный порядковый номер

Я использую некоторые сущности, сопоставленные с таблицами БД Oracle. Для генерации идентификатора я использую генератор последовательности, аннотированный следующим образом:

@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>

Например: если я сгенерирую новый экземпляр своей сущности и захочу сохранить его, я получу 2717 для serialNo, и если я выполню

SELECT SEQUENZ_RULES.NEXTVAL FROM DUAL 

Я получаю 2767 в качестве следующего. Проблема в том, что сгенерированный JPA serialNo должен быть уникальным, и теперь у меня еще есть несколько наборов данных с этим serialNo. Я получаю исключение:

java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (JASON.SYS_C0084866) violated

Нет Есть ли какое-либо кеширование через затмение, которое влияет на генерацию последовательности или в чем может быть ошибка?

Используемые компоненты:
GlassFish 3.1.1
EclipseLink 2.3.0.v20110604-r9504
База данных: Oracle Версия: Oracle Database 11g Release 11.1.0.7.0 - 64 бит
Драйвер: Oracle JDBC driver Версия: 11.2.0.1.0

заранее спасибо

Адем

2 ответа

Когда вы создали последовательность, вы указали размер для увеличения. Например, эта последовательность увеличивается на 1.

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

При использовании SequenceGenerator В аннотации в JPA вы можете указать размер выделения.

@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.

Измените allocSize =1 на allocSize =2, это ошибка Eclipselink.

Другие вопросы по тегам