#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 обрабатывает вещи, что является приятным плюсом.