проблема с Hibernate allocSize для SequenceGenerator - PullRequest
0 голосов
/ 02 октября 2019

Я много читал, используя @SequenceGenerator - он увеличивает реальную последовательность базы данных на единицу, умножает это значение на 50 (значение по умолчанию allocSize) - и затем использует это значение в качестве идентификатора объекта. Но обнаружил проблему, при которой не выполняется sequence.nextVal и не обновляется последовательность.

Использование Hibernate - 5.0.12

Sequence

CREATE SEQUENCE TEST_ENTITY_ID_SEQ INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 CACHE 20;

Вот моя сущность -

@Entity
@Table(name = "TEST_ENTITY")
public class TestEntity  implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @SequenceGenerator(name = "TEST_ENTITY_ID_SEQ", initialValue = 1, allocationSize = 2, sequenceName = "TEST_ENTITY_ID_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TEST_ENTITY_ID_SEQ")
    @Column(name = "COMNT_ID")
    private Long comntId;
    @Column(name = "VIEW_ID")
    private Long viewId;

Мой сервисный код -

TestEntity testEntity = new TestEntity();
testEntity.setViewId(11l);
TestEntity testEntity1 = testEntityRepo.save(testEntity);
return testEntity1.toString();

Первый перезапуск моегоприменение моя последовательность тока val как - 7

Попытка 1: Когда я сохраняю TestEntity, он генерирует Id как - TestEntity{comntId=16, viewId=11}
Попытка2: Когдая сохраняю TestEntity он генерирует Id как - TestEntity{comntId=17, viewId=11}
Попытка3: Когда я сохраняю TestEntity, он генерирует Id как - TestEntity{comntId=18, viewId=11}
Попытка 4: КогдаЯ сохраняю TestEntity, он генерирует Id как - TestEntity{comntId=19, viewId=11}
Currval последовательности по-прежнему такой же как - 7
После перезапуска приложения
Попытка 5: Когда я сохраняю TestEntity, он генерирует Id как - TestEntity{comntId=20, viewId=11}
Попытка 6: Когда я сохраняю TestEntity, он генерирует Id как - TestEntity{comntId=21, viewId=11}
последовательность все так же, как - 7
После перезапуска приложения
Попытка 7: Когда я сохраняю TestEntity, он генерирует Id как - TestEntity{comntId=22, viewId=11}
Попытка8: Когда я сохраняю TestEntity, он генерирует Id как - TestEntity{comntId=23, viewId=11}
Currval последовательности по-прежнему такой же, как - 7

Просто заметьте, что нет никакой разницы, даже если я изменю его на allocationSize = 1

Это ожидаемое поведение? Или я что-то здесь упускаю?

1 Ответ

0 голосов
/ 03 октября 2019

Проблема в том, что я использовал select TEST_ENTITY_ID_SEQ.NEXTVAL from dual, чтобы получить текущие значения последовательности из другого сеанса.

CURRVAL зависит от сессии;то есть каждый сеанс может иметь РАЗНОЕ значение, чем другие сеансы.

Так что, когда я запросил из моего приложения, он начал давать мне правильные значения.

...