автоматическое создание номера для столбца без первичного ключа - PullRequest
4 голосов
/ 04 марта 2010

Я использовал следующую стратегию генерации идентификаторов для первичных ключей.

    @Id
        @GeneratedValue(strategy = IDENTITY)
        @Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
        private Integer id;

Я хотел бы сделать то же самое для столбца без первичного ключа. [a] Какова будет семантика определения схемы автоматической генерации для такого ключа [b] Есть ли гарантия, что в сгенерированном номере не будет пробела в числах?

Ответы [ 2 ]

1 голос
/ 04 марта 2010

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

Разрывы могут произойти, если две вставки происходят одновременно, и одна транзакция откатывается, например (если бы база данных обеспечивала отсутствие пропуска, все транзакции нужно было бы сериализовать).

EDIT

Пример для оракула взят из этой страницы :

CREATE SEQUENCE supplier_seq
    MINVALUE 1
    START WITH 1
    INCREMENT BY 1
    CACHE 20;

Что касается последовательности, опция кэша указывает, сколько значений последовательности будет храниться в памяти для более быстрого доступа.

Недостатком создания последовательности с кешем является то, что в случае сбоя системы все значения кэшированной последовательности, которые не были использованы, будут «потеряны». Это приводит к «пробелу» в назначенных значениях последовательности. Когда система возвращается, Oracle будет кэшировать новые номера с того места, где она остановилась в последовательности, игнорируя так называемые «потерянные» значения последовательности.

1 голос
/ 04 марта 2010

Если вы удалите аннотацию @Id и оставите все остальное (конечно же, изменив имя поля), это должно сработать.

    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "columnName", unique = true, nullable = false, insertable = false, updatable = false)
    private Integer columnName;

Позволяя базе данных генерировать значения столбцов, вы обеспечите отсутствие пробелов, кроме случаев удаления и отката.

Например, если вы удалите строки в середине таблицы, это создаст пробел, который не будет заполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...