Проблема создания последовательности Hibernate 5

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

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

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

Юридическое лицо:

@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;

person Sydubabu    schedule 02.12.2015    source источник


Ответы (3)


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

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

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

В последовательности INCREMENT BY должно быть установлено то же значение, что и allocationSize.

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

max(ID) +locationSize

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

-- 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

Обратите внимание, для этого поведения необходимо, чтобы свойство hibernate.id.new_generator_mappings имело значение true, поскольку рекомендуется

person Marmite Bomber    schedule 02.12.2015
comment
Я не думаю, что проблема с кешем последовательности, потому что в моем случае кеш на уровне db составляет только 20. Но я получаю 951 вместо 1000. Если это другое 20, я подозреваю, что проблема с кешем. Но здесь разница составляет 50, что является значением allocationSize по умолчанию. - person Sydubabu; 02.12.2015
comment
@Sydubabu Я понял - это может быть вам интересно... - person Marmite Bomber; 02.12.2015

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

person Non Plus Ultra    schedule 02.12.2015
comment
Это ошибка публикации. Обновлено с фактическим - person Sydubabu; 02.12.2015
comment
@Steve Ebersole любая помощь. - person Sydubabu; 02.12.2015

В некоторых случаях ваш пользователь Oracle сможет выбрать ПОСЛЕДОВАТЕЛЬНОСТЬ другого пользователя, чья ПОСЛЕДОВАТЕЛЬНОСТЬ может быть неверной. Поэтому вам следует уточнить у своего пользователя Oracle:

select * from all_sequences t where t.SEQUENCE_NAME = 'HIB_SEQ';
person fyw9527    schedule 15.03.2021
comment
Пожалуйста, не могли бы вы удалить неанглийские символы из своего ответа - см. meta.stackexchange.com/questions/13676/ для получения информации об использовании английского языка в ответах - person Toby Beresford; 15.03.2021