javax.persistence.NonUniqueResultException: запрос не вернул уникальную пружину дротика результата

Я работал с Spring Boot и Flutter. У меня есть 3 списка, в которых ингредиенты, единицы и количество хранятся для каждого ингредиента. Мне нужно, чтобы когда пользователь нажимал кнопку save, цикл повторялся среди 3 списков, получал значение i-го индекса и сохранял его в базе данных, нажимая URL-адрес.

  var unCheckedIngredients = [], unCheckedUnits = [], unCheckedQuantities = [];

                 onPressed: () {
                if (_formKey.currentState.validate()) {
                  _formKey.currentState.save();
                  for (int i=0;i<unCheckedQuantities.length;i++)
                  {
                    insertUserIngredient(unCheckedIngredients[i]);
                    insertUserUnit(unCheckedUnits[i]);
                    insertUserQuantity(unCheckedQuantities[i]);                  
                                        }
                  setState(() {
                    _formKey.currentState.reset();
                    displayChipList.clear();
                  });
                }
              },

Поскольку вызываются 3 функции. Таким образом, он должен работать последовательно, но в DART я не понимаю, в чем проблема, он сначала запрашивает 2-ю инструкцию, а затем 1-ю строку случайным образом. Он должен работать последовательно.

Скажем, если unCheckedQuantities. length = 2 - он выполняет первую строку в цикле for 2 раза, а затем 2-ю строку дважды и так далее.

Ошибка

/flutter (12297): GET http://10.0.2.2:8085/user/ingredient/quantity?ingredient_quantity=3 I/flutter (12297): qauntity = {"timestamp":"2020-04-02T15:29:54.030+0000","status":500,"error": «Внутренняя ошибка сервера», «сообщение»: «запрос не вернул уникальный результат: 2; вложенным исключением является javax.persistence.NonUniqueResultException: запрос не вернул уникальный результат: 2», «путь»: «/user/ingredient /количество"} E/FirebaseInstanceId(12297): не удалось получить токен: AUTHENTICATION_FAILED


person Lily    schedule 02.04.2020    source источник


Ответы (1)


Надеюсь, вы не изменяете список количества, пока он взаимодействует. Если это не так, делают ли функции вставки что-либо асинхронно? Затем вам нужно специально указать компилятору Dart остановиться с помощью ключевого слова await. Даже если это не так, вы все равно можете использовать их для синхронного выполнения вашего процесса, но это не очень хорошая идея, когда вы выполняете тяжелые вычисления.

Для этого ваша функция должна возвращать Future

void insertSomething(){}

To

Future<void> insertSomething(){}

и измените метод onPressed на

 () async {
  if (...) {
    for (...) {
      await insertSomething()
    }
  }
}

Дело в том, что Dart работает аналогично Node-JS неблокирующим образом, поэтому асинхронные события могут завершаться в свое время, и когда они будут завершены, они будут добавлены в очередь событий, и цикл событий подберет их в следующий цикл.

Теперь, когда вам не нужно такое поведение, вы используете async/await, чтобы заставить цикл обработки событий ожидать обработки конкретного события. Вы можете взглянуть на дартспад ниже, сначала запустите его в обычном режиме, а затем попробуйте удалить ключевые слова ожидания из результатов ()

[https://dartpad.dev/4bf516fc43a61d4a8ad5870e61eeb1e4][1]

person Nadeem Siddique    schedule 07.04.2020