2016-10-14 3 views
0

среды: Websphere 8,5, OpenJPA 2,0, DB2 г/OSOpenJPA генератора последовательности с отрицательными значениями

Есть две таблицы: одна с проверенными данными, а другой с проектами данных (промежуточную таблицу) + Просмотреть эту отображаемую информацию от обоих столы.
Чтобы избежать столкновения первичного ключа, я решил, что в промежуточной таблице будут иметь отрицательные значения в качестве первичного ключа. Он работал в простом SQL, но мой подход потерпел неудачу, когда я попытался определить генератор для постановки таблицы в Java коде

генератора для отрицательного ключ был определен следующим образом:

CREATE SEQUENCE X AS INTEGER START WITH -1 INCREMENT BY -1 
MINVALUE -999999 MAXVALUE 0 

На стороне объекта:

@Id 
@SequenceGenerator(name="X", sequenceName="X") 
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="X") 
@Column(name = "ID")` 

Первый элемент был успешно создан (со значением -1), но введение второго элемента потерпела неудачу с

ДИАПАЗОН ЗНАЧЕНИЙ ДЛЯ КОЛОНКИ ИЛИ ПОСЛЕДОВАТЕЛЬНОСТИ ИДЕНТИЧНОСТИ ВЫШЕ. SQLCODE = -359, SQLSTATE = 23522

Помогите определить @SequenceGenerator? Возможно ли это в Open JPA 2.0? Возможно, определение последовательности было неправильным (MINVALUE/MAXVALUE)

+0

В коротком сроке исправить я модифицированный генератор: 'СТАРТ С -99999 Инкримента 1'. Не очень красиво, но это работает. – user2706534

+0

Должна быть ошибка/особенность, характерная для DB2 z/OS - она ​​работает как ожидается в Linux. – mustaccio

ответ

0

Во-первых, я думаю, что ваш вариант «НАЧАТЬ С -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

Смежные вопросы