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.