Hilo - самый быстрый подход к назначению идентификаторов. Использование полей идентификаторов работает и безопаснее (см. Ниже), но поскольку идентификатор генерируется базой данных, каждая вставка строки требует операции чтения для определения идентификатора строки.
Если вы собираетесь использовать hilo, убедитесь, что вы понимаете детали того, как работает алгоритм. (Я думаю, что это описано в другом месте на этом сайте.) Если вы сделаете неправильный выбор для типа данных столбца или hilo, или для значения "lo", вы можете в итоге получить обтекание, которое приведет к генерированию уже используемых чисел, что, конечно, очень плохо.
Типичный способ обработки ввода данных - закрыть сеанс, выполнить ввод данных, а затем прикрепить обновленные объекты к новому сеансу. Это описано в документации.
Хитрость с присоединением заключается в следующем: скажем, что объект A содержит ссылку на объект B, а объект B содержит ссылку на объект C. Если вы «прикоснулись» к объектам A и B во время начального сеанса, A и B будут были загружены, и B будет содержать ссылку на прокси-сервер C. Если вы присоедините A к новому сеансу, но забудете присоединить B, ссылка на прокси-сервер B все равно будет указывать на старый закрытый сеанс, что приведет к исключению, если вы попытаетесь следовать этому.
Это может быть сложнее, чем кажется, понять это правильно. Во время начального сеанса, если вы вызвали функцию, которая выполняла какой-то поиск по графу объектов, позже может быть трудно узнать, какие именно объекты необходимо присоединить к новому сеансу, чтобы все работало правильно.
В зависимости от того, насколько надежно ваше соединение с вашей базой данных, может быть лучшим вариантом оставить сеанс открытым для операции ввода данных и избежать потенциальных проблем, связанных с присоединением объектов к новому сеансу. Многое зависит от того, насколько сложна ваша объектная модель и что вам нужно делать с объектами.
Также будет иметь значение, какую базу данных вы используете. Например, Postgres использует MVCC, поэтому открытый сеанс никогда не блокирует других пользователей от чтения из базы данных. В базе данных, которая использует блокировку строк, блокировки являются большой частью проблемы с длинными сеансами.