2016-04-07 2 views
0

Как я могу генерировать идентификаторы для объекта не последовательным образом? Я бы предпочел, чтобы идентификаторы не были линейными и, следовательно, предсказуемыми. Тем не менее, стратегии генерации @GeneratedValue составляют AUTO, TABLE, IDENTITY, SEQUENCE. Есть ли такой (автоматический) вариант? Или мне нужно сгенерировать его самостоятельно? (И затем проверьте, существует ли такой идентификатор и т. Д.)Hibernate сгенерировать идентификатор объекта не последовательно

На этом примечании я считаю, что наличие линейных прогнозируемых идентификаторов не является идеальным способом. Я прав? Например, для таких ресурсов, как незарегистрированные видеоролики YouTube или совместное использование ссылок с Google Диска, было бы большим недостатком, чтобы иметь идентификаторы последовательно, так как было бы очень легко проходить через них.

+0

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators-uuid –

ответ

0

Рекомендуемая мной рекомендация - избегать воздействия внутреннего первичного ключа на внешних клиентов. Помимо легко угаданных значений, о которых вы упомянули, это также затрудняет консолидацию баз данных позже (например, если у вас есть несколько экземпляров prod, которые вы хотите объединить) или рефакторинг структуры данных (в этом случае текущий первичный ключ больше недействителен/полезный/что угодно).

Если вы сохраняете идентификатор в своем локальном приложении, то использование последовательного ПК просто отлично, потому что оно используется только в базе данных, и это распространенный подход во многих РСУБ.

Теперь вам нужен уникальный идентификатор, основанный на бизнесе, чтобы иметь возможность поднять конкретный XYZ, который может потребоваться потребителю. Может быть один или несколько столбцов, но его смысл должен иметь бизнес, означающий больше, чем значение базы данных, если это имеет смысл. Лично мне нравится использовать GUID/UUID, потому что, хотя теоретически возможно, очень редко у вас есть перекрытия (в зависимости от реализации). Тем не менее, вы можете не захотеть использовать GUID как ваш ПК, потому что в FK-связях есть намного больше байтов, тогда как целое число существенно меньше.

Если вы действительно хотите использовать несекретный идентификатор, который может быть использован потребителем, может быть возможно создать представление базы данных, которое выполняет некоторую рандомизацию, и использовать его в качестве таблицы в @GeneratedValue (отказ от ответственности: I Я никогда не делал ничего подобного, я всегда использовал генераторы последовательности, но теоретически это могло бы работать).

Смежные вопросы