Спящий режим: получение сгенерированного идентификатора из вызываемой пользовательской вставки

#hibernate #stored-procedures #identity

#переход в спящий режим #хранимые процедуры #идентификация

Вопрос:

У меня есть класс сущности с

 @Entity
@SQLInsert(callable = true, sql = "{ call sp_InsertEntity(?, ?, ?) }")
public class Entity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "entity_id")
  private int entityId;
...
}
  

sp_InsertEntity выполняет стандартную ВСТАВКУ и возвращает @@IDENTITY.
Но после session.save(entity) значение EntityId остается равным 0.

Как принудительно перевести в спящий режим, используя возвращаемое значение или выходной параметр или @@IDENTITY или SCOPE_IDENTITY() для инициализации сгенерированного идентификатора?

Комментарии:

1. Я нашел решение в настройке <имя свойства=»jdbc.use_get_generated_keys»>false</property>

Ответ №1:

Возможно, чтобы немного прояснить это для других, которые сталкиваются с той же проблемой — при использовании <property name="jdbc.use_get_generated_keys">false</property> hibernate не будет автоматически генерировать SELECT SCOPE_IDENTITY() после вашей процедуры (что, очевидно, не работает в первую очередь, потому что этот выбор не находится в той же области, что и вставка), следовательно, у вас естьчтобы вручную добавить SELECT SCOPE_IDENTITY() после вставки в хранимую процедуру.

Написание хранимых процедур вставки таким образом также сделает их совместимыми с тем, как Entity Framework обрабатывает вещи, что является приятным плюсом.