Подтвердить что ты не робот

Предварительное распределение генератора EclipseLink и Sequence

У меня проблема, с которой я не могу разобраться. В спящем режиме у меня нет проблем со следующим:

@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", allocationSize=500 )

Тогда в моей schema.ddl у меня есть это:

CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;

Нечего здесь видеть. Все работает так, как ожидалось. Однако, если я переключу своего провайдера на EclipseLink, я получаю эту ошибку:

The sequence named [EMAIL_SEQ_GEN] is setup incorrectly.  Its increment does not match its pre-allocation size.

Итак, конечно, я google и вижу что-то о EclipseLink, создающем отрицательное число, если начальное значение равно 1 и что оно должно равняться распределению.

Итак, хорошо, поэтому добавление "initialValue = 500" и обновление моих сценариев DDL до "START 500" исправляет это, но теперь моя нумерация начинается с 500 вместо 1. Что дает? Является ли это ошибкой EclipseLink или есть что-то, чего я не понимаю. Я хотел бы генерировать последовательности, начинающиеся с 1 и имеющие размеры размещения, которые настроены на объект (в данном случае 500). Как мне это сделать с EclipseLink?

Спасибо!

Еще один способ задать это.... учитывая этот DDL:

CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;

Каков правильный способ аннотировать мой объект, чтобы использовать его с EclipseLink?

Если я позволю EclipseLink генерировать мой DDL, тогда это:

@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", initialValue=1, allocationSize=500 )

Сгенерирует это:

CREATE SEQUENCE EMAIL_SEQ_GEN INCREMENT BY 500 START WITH 500;

Какой тип подразумевает, что НЕВОЗМОЖНО создать DDL с "START WITH 1" с использованием EclipseLink.

4b9b3361

Ответ 1

По умолчанию объекты, аннотированные с помощью @SequenceGenerator, используют initialValue = 1 и alocationSize = 50.

public @interface SequenceGenerator {
    /** 
     * (Optional) The value from which the sequence object 
     * is to start generating.
     */
    int initialValue() default 1;

    /**
     * (Optional) The amount to increment by when allocating 
     * sequence numbers from the sequence.
     */
    int allocationSize() default 50;
}

"Последовательный" идентификатор объекта, по-видимому, вычисляется EclipseLink со следующей формулой:

entityId = initialValue - allocationSize + INCREMENT_BY

или в случае использования DDL:

entityId = START_WITH - allocationSize + INCREMENT_BY

Возвращаясь к вашим конкретным случаям:


@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    allocationSize=500
) // initialValue=1 (default)

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 1 INCREMENT BY 500;

производит

entityId = 1 - 500 + 1 = -500 // EclipseLink error

@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    initialValue=1, 
    allocationSize=500 )

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 1 INCREMENT BY 500;

производит

entityId = 1 - 500 + 1 = -500 // EclipseLink error

@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    initialValue=500, 
    allocationSize=500
)

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 500 INCREMENT BY 500;

производит

entityId = 500 - 500 + 500 = 500 // fine, but inappropriate
entityId = 500 - 500 + 1000 = 1000 // incremented by 500
entityId = 500 - 500 + 1500 = 1500 // incremented by 500
...

Для удовлетворения ваших требований необходимо использовать следующее:

@SequenceGenerator( 
    name="email-seq-gen", 
    sequenceName="EMAIL_SEQ_GEN", 
    allocationSize=500 
) // initialValue=1 (default) but 'START WITH'=500

CREATE SEQUENCE EMAIL_SEQ_GEN START WITH 500 INCREMENT BY 1;

производит

entityId = 500 - 500 + 1 = 1
entityId = 500 - 500 + 2 = 2
entityId = 500 - 500 + 3 = 3
...

Существующая последовательность может быть удалена из базовой базы данных следующей командой :

DROP SEQUENCE email_seq_gen RESTRICT;

Надеюсь, это поможет.

Ответ 2

Ваша последовательность должна начинаться с 500, а не 1. Если вы начинаете с 1, то первое следующее значение будет давать только 1 id вместо 500.

В противном случае вызовите nextval в последовательности после его настройки, чтобы он достиг 501.

Является ли ошибка предупреждением или ошибкой? Если вы просто проигнорируете его, он все равно работает?