У сущности есть следующие аннотации в столбце id:
@Id
@SequenceGenerator(name = "JOB_MISFIRE_ID_GENERATOR", sequenceName="job_misfire_sequence", allocationSize=10)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "JOB_MISFIRE_ID_GENERATOR")
@Column(unique = true, nullable = false)
private Long id;
В базе данных у меня есть следующее:
CREATE SEQUENCE job_misfire_sequence
INCREMENT 10
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
И эта последовательность используется для получения значения по умолчанию для столбца.
ALTER TABLE job_misfires
ALTER COLUMN id SET DEFAULT nextval('job_misfire_sequence');
Когда я выполняю ручную вставку вручную в базу данных, используя nextval ('job_misfire_sequence'), все работает хорошо. Когда текущее значение последовательности было 1, были получены следующие значения идентификатора:
SELECT nextval('job_misfire_sequence'); --> 1
SELECT nextval('job_misfire_sequence'); --> 11
SELECT nextval('job_misfire_sequence'); --> 21
SELECT nextval('job_misfire_sequence'); --> 31
Но что происходит, когда hibernate вставляет строку в эту таблицу, так это то, что она получает следующее значение из этой последовательности (в данном сценарии - 41), умножает его на 10 и использует это значение id. Это означает, что вставленная строка теперь имеет значение идентификатора 410.
Что я делаю не так? Эта ситуация приведет к конфликтам, так как hibernate не использует значение, предоставленное последовательностью. Если я понял, правильное сочетание
allocationSize = 10
в аннотации и
INCREMENT 10
в последовательности следует гарантировать, что hibernate должен запрашивать новое значение из последовательности каждое десятое значение. Почему этого не происходит? Почему значение из последовательности умножается на 10?
Я использую
- Postgresql 9.0.3
- Hibernate 3.5.5
- Hibernate JPA 2.0 api 1.0.0 final
Обновление 1:
Как было предложено в интернете, установка значения allocSize в аннотации 1 решает эту проблему. Теперь значения идентификаторов действительно взяты из последовательности в db, и я могу спокойно вставлять строки в эту таблицу вручную.
Но:
- Вызывает ли наличие allocSize = 1 проблемы с производительностью?
- Разве это не огромная ошибка в том, что значение из последовательности не используется, как в hibernate, а умножается на значение allocSize?
- Кто виноват? Hibernate?
- Есть ли исправление?