Стратегия создания значения Hibernate

Я использую этот код в гибернации.

@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="RightID", unique=true, nullable=false)

проблема в том, что когда я удаляю строку, "RightId" не остается в последовательности. Я хочу что-то вроде, hibernates должен проверить id, если какое-то значение id отсутствует, оно должно дать это значение "RightsId", иначе продолжайте нормально

3 ответов


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

Если какая-то странная причина заставляет такой дизайн, вы должны использовать пользовательский генератор. Детали реализации можно найти через этот вопрос:генератор Hibernate ID


Я не думаю, что в hibernate есть такой optio. Вместо AUTO вы также можете попробовать следующие варианты стратегии:

  1. GenerationType.Таблица - поставщик сохраняемости использует таблицы базы данных для управления ключами.

  2. GenerationType.Последовательность - поставщик сохраняемости использует последовательность базы данных для генерации ключей. База данных должна поддерживать Последовательности

  3. GenerationType.Личность - поставщик сохраняемости откладывает создание ключа в базе данных. База данных должна поддерживать тип столбца IDENTITY.

другой момент: они могут не предоставить такую опцию, потому что это также замедлит производительность. Для каждой вставки ему придется искать через whole ID. Вы можете себе представить, насколько это влияет на производительность.


основная причина, по которой это не поддерживается внутренне, -безопасность. позвольте привести вам пример,

1. Безопасность

У нас есть база данных для мобильных SIM-карт, которая имеет уникальный идентификационный номер. Если ваш sim потерян, а затем вы деактивировали его. Но допустим, какой-то другой пользователь купил новую sim-карту и эту sim-карту, учитывая старый уникальный номер, который был у вашей sim-карты(по вашей логике). Тогда это может привести к проблеме. Скажем, что новый пользователь сделал какой-то террористический акт, потом полиция отследит номер Сима и может прийти к тебе.(поскольку он был новым пользователем, а некоторые в местах sim все еще показывают только ваше имя)...

2. задержка

и производительность вопрос есть. Каждый поиск, чтобы найти неиспользуемый порядковый номер будет O (n) вместо прямой O (1) .