Во-первых, я думаю, что ваш вариант «НАЧАТЬ С -99999 INCREMENT BY 1» - лучший вариант. Я не уверен, почему вы чувствуете, что это «некрасиво». Если вы сделаете это:
CREATE SEQUENCE SEQ_MYSEQ AS INTEGER ПУСК С -99999 Инкримент 1 MINVALUE -999999 MAXVALUE 0
Вы все еще диапазоне связаны между -99999 и 0, верно?
Как я объясню ниже, я думаю, что OpenJPA и EclipseLink любят подсчитывать. Поэтому я думаю, тебе повезет с этим.
Тем не менее, позвольте мне ответить на ваш вступительный вопрос. Я проверил тест на OpenJPA и EclipseLink (поскольку WebSphere использует Ecliplselink в WAS v9 и Liberty). Я не могу заставить ваш сценарий работать с EclipseLink, но может заставить его работать с OpenJPA (но это было не так). Позвольте мне изложить, что я сделал: это SQL, в котором я определил свою последовательность (как вы указали в описании):
CREATE SEQUENCE SEQ_MYSEQ AS INTEGER START WITH -1 INCREMENT BY -1 MINVALUE -999999 MAXVALUE 0;
Я определил мой генератор последовательности в моей сущности, как:
@Id @SequenceGenerator (Name = "IDGENERATOR", SequenceName = "SEQ_MYSEQ", allocationSize = 1, InitialValue = -1) @GeneratedValue (стратегии = GenerationType.SEQUENCE, generator = "IDGENERATOR") private int id;
Обратите внимание, что я говорю JPA, чтобы начать с -1, и использовать allocize из 1. Состояние JavaDocs по умолчанию равно 50. Один облом (но не стоппер шоу) с allocSize 1 состоит в том, что JPA поставщик перейдет в базу данных для каждого значения последовательности (т.е. локальное кэширование не будет использоваться). Однако, если это не используется, кажется, что OpenJPA и EclipseLink хотят подсчитать размер выделения. Его трудно закодировать. То есть, либо один запросит БД для следующего значения, а затем подсчитает оттуда путем выделения, не обратного отсчета.На OpenJPA, вы должны использовать это свойство:
В противном случае, по умолчанию OpenJPA выполняет «ALTER Sequence», чтобы сделать определенный приращению BY определены в SequenceGenerator соответствует тому, что находится в базе данных. Если я не добавлю это свойство, я получаю такое же исключение из-за исчерпания диапазона. Во всяком случае, с этим все хорошо работает на OpenJPA. В EclipseLink я получаю это исключение:
Описание исключения: последовательность с именем [SEQ_MYSEQ] настроена неправильно. Его прирост не соответствует его размеру предварительного распределения. в org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist (EntityManagerImpl.java:510) в hat.test.MySeqTest.main (MySeqTest.java:28)
Я не копнуть в EclipseLink чтобы понять это, но я немного поиграл с Sequence, и похоже, что EclipseLink не любит отрицательные значения ????
Спасибо,
Хит Thomann
В коротком сроке исправить я модифицированный генератор: 'СТАРТ С -99999 Инкримента 1'. Не очень красиво, но это работает. – user2706534
Должна быть ошибка/особенность, характерная для DB2 z/OS - она работает как ожидается в Linux. – mustaccio