Вот кое-что, что сработало для меня. Адаптируйте по необходимости.
@SuppressWarnings("deprecation")
public static void saveWithOverwrittenId(Session session, Object entity) {
String tableName = entity.getClass().getSimpleName();
boolean identityInsertSetToOn = false;
try {
session.connection().createStatement().execute("SET IDENTITY_INSERT "+tableName+" ON");
identityInsertSetToOn = true;
session.beginTransaction();
session.saveOrUpdate(entity);
session.getTransaction().commit();
} catch (SQLException e) {
session.getTransaction().rollback();
throw new RuntimeException(e);
} finally {
if (identityInsertSetToOn) {
try {
session.connection().createStatement().execute("SET IDENTITY_INSERT "+tableName+" OFF");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
В моем случае таблица SQL Server имела то же имя, что и класс Entity. Для вас это, вероятно, не соответствует действительности. Тогда одним из решений будет запрос имени таблицы в качестве параметра.