Я использую Spring с Hibernate (и базой данных SQL Server) .Для одной из моих сущностей мне нужно сгенерировать PK, который представляет собой комбинацию числа и строки .. что-то вроде ABC1001, DEF1002 и т. Д.
Я использую 'assigned
'ключ для моих сущностей, так как этот тип PK (комбинация числа и строки, то есть ABC 1001) не может быть сгенерирован с помощью простой последовательности / идентификатора.
То, что я хочу, это
- Создание PK с помощью идентификатора БД и увеличение значения идентификатора на 1 (для следующего поколения ПК)
- Объедините результат (т. Е. Число, возвращенное предыдущим шагом) с соответствующей строкой (т. Е. ABC), чтобы сделать егоPK для моей сущности, например: ABC1001
- Назначьте этот ключ моей сущности и сохраните мои данные, вызвав session.save ()
Есличто-то не получается, откат транзакции, т.е. откат вставки сущности и откат любых изменений, внесенных в Identity
Подход, который я имею в виду, заключается в следующем: Создать хранимую процедуру, которая может выполнить первые два шага (Генерация ПК, Инкремент Identity, объедините число со String), а затем назначьте ключ для Entity и вызовите session.save ().
Моя проблема заключается в том, что мне придется использовать HibernateCallBack для выполнения моей процедуры, где мне придетсяиметь дело с JDBC Connection.Как только метод завершится, мне придется закрыть соединение JDBC, а затем на следующем шаге я смогу продолжить сохранение своей сущности (session.save()
).
Я не нахожу способ выполнить две вещи [т.е. вызвать процедуру и вызвать session.save ()] в одной транзакции.Я использую декларативную транзакцию, предлагаемую Spring.
Есть ли способ выполнить две вещи в одной транзакции, поэтому, если вставка сущности не удалась, я могу даже откатить изменения, внесенные в Identity?
Или есть лучшая стратегия, которую вы можете предложить?