2015-12-02 7 views
3

Я перехожу к hibernate 5 из 3. Я вижу, что генератор последовательности не работает должным образом в Hibernate 5. У меня есть последовательность с минимальным значением 1000 и приращением на 1. Но когда я пытаюсь создать запись нового объекта, я вижу запись, вставленную с идентификатором 951. Кажется, что идентификатор был минус 50 из фактической последовательности следующего значения. В моем случае идентификатор должен быть 1000.Hibernate 5 Sequence Generate Issue

Пожалуйста, дайте мне знать любую помощь.

Вот моя сущность и последовательность:

Entity:

@Entity 
@Table(name = "SOME TABLE") 
public class Group { 

    @Id 
    @Column(name = "id") 
    @SequenceGenerator(name = "name", sequenceName ="SEQ_name") 
    @GeneratedValue(strategy = GenerationType.AUTO, generator="name") 
    private Long id; 

    @Pattern(regexp = "^[^\\*]*$", message = "{3011}") 
    @Size(message = "{3014}") 
    @NotBlank(message = "{3000}") 
    @Column(name = NAME, unique = true, nullable = false) 
    private String name; 

Последовательность:

CREATE SEQUENCE SEQ_name MINVALUE 1000 NOMAXVALUE INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE; 

ответ

0

Последовательность вы определили не начинается с 1000, а с 1 (MINVALUE 1) , Я также не вижу, где вы задали указанную последовательность как последовательность, используемую вашей сущностью.

+0

Сво публикуем ошибку. Обновлено с фактическим – Sydubabu

+0

@Steve Ebersole любая помощь. – Sydubabu

5

Hibernate вызывает SEQ_name.nextval но если allocationSize больше 1, это уменьшает его на allocationSize и увеличивает его на 1.

Следующая (1-allocationSize) генерацию ключей выполняются без связи с базой данных простым путем увеличивается на 1.

в результате, если вы используете по умолчанию allocationSize что 50, есть два последствия:

последовательность должна иметь INCREMENT BY набор на то же значение, как allocationSize

Для выравнивания последовательности с существующим ключом в базе данных, установите START WITH в

макс (ID) + allocationSize

Вот небольшой пример

-- START WITH = max(ID) + allocation size 
-- INCREMENT BY = allocation size 
-- e.g. if 100 is the last key, 
-- to start with a key 101 - set START WITH to 150 
CREATE SEQUENCE hib_seq START WITH 150 INCREMENT BY 50; 



select hib_seq.nextval - 50 + 1 from dual; 
101 
-- 49 times Hibernate performs increase by 1 - keys 102 to 150 
-- new sequence generation 
select hib_seq.nextval - 50 + 1 from dual; 
151 
+0

Я не думаю о проблеме с кешем последовательности, потому что в моем случае кеш на уровне дБ равен только 20. Но я получаю 951 вместо 1000. Если это 20 разных, я подозреваю проблему с кешем. Но здесь разница составляет 50, которая является значением по умолчанию ** allocSize ** value – Sydubabu

+0

@Sydubabu Я получил это - [это] (http://stackoverflow.com/questions/5346147/hibernate-oracle-sequence-produces-large-gap) может быть интересным для вас ... –

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

  • Нет связанных вопросов^_^