Hibernate SequenceGenerator и настройка значенияlocationSize

Я столкнулся с проблемой сгенерированного идентификатора гибернации. Я использую Sequence Generator для генерации своего идентификатора. База данных — Oracle 11g и версия гибернации 3.6.1.

Я знаю, что значение по умолчанию в спящем режиме в спящем режиме равно 50, и, следовательно, спящий режим делает вызовы базы данных каждые 50 вставок для получения идентификатора. Следовательно, я изменяю selectionSize на 1000, чтобы уменьшить количество обращений к базе данных, как показано ниже:

    @GeneratedValue(generator = "test_gen", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "test_gen", sequenceName = "myschema.my_oracle_sequence", allocationSize = 1000)

Однако есть несколько проблем.

Во-первых, это улучшение, поэтому я не могу обновить спящую версию, чтобы использовать новые генераторы последовательностей.

Во-вторых, я не могу использовать указанное ниже свойство, так как это повлияет на другие объекты спящего режима, которые не должны быть затронуты моим изменением. Есть ли способ указать спящему режиму применить указанное ниже свойство только к одному объекту?

    hibernate.id.new_generator_mappings=true

В-третьих, я попробовал приведенное ниже сопоставление для спящего режима. Однако здесь я должен указать начальное значение. Если нет, он принимает начальное значение как 1 и вычисляет идентификатор, и я получаю, как и ожидалось, исключение ограничения, поскольку идентификатор уже использовался. Я не могу указать начальное значение здесь снова, так как код уже используется, и как первичный идентификатор, так и nextval последовательности были перемещены из своих начальных значений.

    @GenericGenerator(
    name = "sequenceGenerator", 
    strategy = "enhanced-sequence",
    parameters = {
        @org.hibernate.annotations.Parameter(
            name = "optimizer", 
            value = "pooled"
        ),
        @org.hibernate.annotations.Parameter(
            name = "increment_size", 
            value = "500"
        )
    }
)
@GeneratedValue(
    strategy = GenerationType.SEQUENCE, 
    generator = "sequenceGenerator"
)

В-четвертых, я не могу использовать код, который я упомянул в первом блоке кода, так как я случайно вижу UniqueConstraintViolationException при вставке записей, как это видели несколько других людей. JPA 2 @SequenceGenerator @GeneratedValue, создающий нарушение уникального ограничения

Могу ли я со всеми этими ограничениями увеличить размер распределения, чтобы повысить производительность вставки записей. Я бы вставил около 10-40 миллионов записей за один раз.

С уважением, В


person LearnToLive    schedule 09.02.2016    source источник
comment
Чтобы избежать UniqueConstraintViolationException при использовании hibernate.id.new_generator_mappings=true, вы должны установить свойство incrementBy в своей последовательности БД, чтобы оно соответствовало аллокацииSize аннотации @SequenceGenerator в идентификаторе вашего объекта. Обратите внимание, что таким образом возможны пропуски идентификаторов в вашей таблице, но это не проблема для большинства случаев использования.   -  person beegor    schedule 25.05.2017
comment
@beegor, я использую hibernate.id.new_generator_mappings=false, так как я не могу изменить значение приращения БД, как я могу решить проблему с пробелом?   -  person Lakshya Srivastava    schedule 18.05.2020