Как спящий режим заполняет идентификаторы автоматически сгенерированных полей? - PullRequest
6 голосов
/ 07 июня 2011

Скажите, у меня есть объект с автоматически сгенерированным первичным ключом.Теперь, если я попытаюсь сохранить сущность со значениями всех других полей, которые могут быть не уникальными.Сущность автоматически заполняется идентификатором вставленной строки.Как он получил это значение первичного ключа?

РЕДАКТИРОВАНИЕ:

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

Ответы [ 3 ]

7 голосов
/ 22 июня 2011

Hibernate использует три метода для извлечения автоматически сгенерированного поля БД в зависимости от того, что поддерживает драйвер jdbc или используемый вами диалект.

Hibernate извлекает сгенерированное значение поля, чтобы вернуть его в pojo:

  1. Использование метода Statement.getGeneratedKeys ( Statement javadocs)

    или

  2. Вставка и выбор сгенерированного значения поля непосредственно из оператора вставки. ( диалект Javadocs)

    или

  3. Выполнение оператора select после вставки для получения сгенерированного значения IDENTITY

Все это делается внутри hibernate.

Надеюсь, вы ищете объяснение.

1 голос
/ 07 июня 2011

В этом разделе документации Hibernate описано автоматическое создание идентификаторов. Обычно стратегия генерации AUTO используется для максимальной переносимости, и, предполагая, что вы используете аннотации для предоставления метаданных вашего домена, вы можете настроить его следующим образом:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

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

0 голосов
/ 22 июня 2011

Когда вы создаете объект с, скажем, суррогатным первичным ключом, полученным из последовательности, вы передаете его сеансу Hibernate с этим полем, для которого установлено значение, которое Hibernate интерпретирует как «не назначенный», по умолчанию 0. Это поле не заполняется присвоенным значением до тех пор, пока соответствующая запись не будет вставлена ​​в таблицу базы данных. Вы можете инициировать вставку, явно вызвав flush () в сеансе гибернации или выполнив чтение базы данных в том же сеансе. После этого вы можете проверить значение этого поля, и оно будет присвоено, а не 0.

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