Стратегия создания базы данных H2 оставляет пробелы между значениями id - PullRequest
0 голосов
/ 01 мая 2020

Я работаю над REST API, используя Spring. У меня есть этот класс, идентификаторы которого генерируются автоматически:

@Entity
public class Seller implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private double tasa;

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getTasa() {
        return tasa;
    }
    public void setTasa(double tasa) {
        this.tasa = tasa;
    }

}

Я добавил несколько конечных точек для создания, удаления и получения продавца из БД. Поэтому моя проблема возникает, когда я удаляю одного продавца из БД. Когда я пытался создать новый, я ожидал получить меньшее доступное значение для идентификатора, но на самом деле используется какой-то счетчик / последовательность. Позвольте мне показать вам:

enter image description here

enter image description here

enter image description here

enter image description here

Итак, во втором посте я ожидал json с id = 1, вместо этого я получил 2. Я попытался использовать TABLE и Стратегии IDENTITY, но нежелательное поведение продолжалось. Итак, мой вопрос: как мне добиться желаемого поведения? Я не хочу пропусков между идентификаторами моего продавца.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Я пытался использовать стратегии TABLE и IDENTITY, но нежелательное поведение продолжалось.

Это не нежелательное поведение. Проверьте Как генерируются первичные ключи .

Итак, мой вопрос: как мне добиться желаемого поведения? Я не хочу пропусков между идентификаторами моего продавца

Один из способов добиться этого - не использовать @GeneratedValue(strategy = GenerationType.AUTO) и не устанавливать вручную идентификатор из программы, и там вы можете поместить любой логин c, какой пожелаете. .

Не рекомендуется устанавливать первичный ключ вручную. Если вы хотите, вы можете использовать любое другое поле, например seller_code для этого поведения. Еще один вопрос , который похож на этот.

1 голос
/ 01 мая 2020

Как правило, база данных предназначена для приращения. Когда идентификатор генерируется, он не генерируется на основе содержимого таблиц. вместо этого идентификатор генерируется с использованием последовательности. В вашем примере у вас есть несколько записей, но представьте себе базу данных с большим количеством записей. База данных генерирует идентификаторы на основе последовательности (или аналогичной), чтобы избежать чтения данных, дорогостоящий процесс.

Если идентификатор не относится к бизнесу, то это поведение не влияет на ваш процесс. (Как и идентификатор сообщения в чате).

Если идентификатор важен, я рекомендую переопределить процесс удаления. вам, вероятно, нужно сохранить все идентификаторы, например, идентификатор клиента.

Если вы хотите сохранить последовательность и разрешить удаление записей, рекомендуется создать идентификатор самостоятельно, но вам необходимо решить такие проблемы, как совпадение

...